2

我正在尝试设置与时间长度相对应的产品(报纸订阅)。

我让客户使用 Django Admin 添加产品类型(各种订阅长度),但我找不到任何关于我应该使用什么模型对象类型来存储时间值(如 52 周、26 周、 1 周等)。我希望能够选择几天或几周的长度,因为有些论文是每周一次,有些则是每天一次。

现在我的产品模型是:

class Product(models.Model):
    product_type = models.CharField(max_length=100)
    product_description = models.CharField(max_length=255)
    product_cost = models.DecimalField(decimal_places=2, max_digits=4)
    product_active = models.BooleanField()
    def get_absolute_url(self):
        return "/signup/%i/" % self.id
    def __unicode__(self):
        return self.product_type

有什么方法可以让 product_type 成为一个对象类型,让用户定义时间值?

谢谢,

安东尼

4

2 回答 2

4

我认为只存储两个值会更容易,一个数字值和一个数字代表的选择。

duration = models.IntegerField()
duration_type = models.CharField(max_length=32, choices=[
    ("day", "Days"),
    ("week", "Weeks")])

假设您有一个单独的订阅模型,那么您可以将该模型中的到期时间计算为一种方法:

class Subscription(models.Model):
    product = models.ForeignKey(Product)
    starts = models.DateField()
    def expires(self):
        from datetime import timedelta
        if self.product.duration_type == "day":
            days = self.product.duration
        elif self.product.duration_type == "week":
            days = self.product.duration * 7
        return self.starts + timedelta(days=days)
于 2012-04-18T16:26:50.690 回答
0

您可以添加一些描述订阅开始和结束的 DateTime 模型字段。您可以创建一个模型的方法,通过从另一个日期时间减去一个日期时间来返回一个时间增量

class Product(models.Model):
    product_type = models.CharField(max_length=100)
    product_description = models.CharField(max_length=255)
    product_cost = models.DecimalField(decimal_places=2, max_digits=4)
    product_active = models.BooleanField()

    subscription_start = models.DateTimeField()
    subscription_end = models.DateTimeField()

    def get_duration(self):
        # returns a timedelta
        return self.subscription_end - self.subscription_start

    def get_absolute_url(self):
        return "/signup/%i/" % self.id
    def __unicode__(self):
        return self.product_type

例如:

>> import datetime
>> d1 = datetime.datetime(1986,14,05,0,0,0)
>> d2 = datetime.datetime.now()
>> print d2 - d1
9471 days, 17:24:31

您可以使用该 timedelta 在您的视图中进行计算

于 2012-04-18T16:29:40.103 回答