我在Django Admin中使用什么模型对象类型来存储时间值?

时间:2012-04-18 16:17:11

标签: django datetime django-models

我试图设置一个与一段时间相对应的产品(报纸订阅)。

我让客户使用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成为一个允许用户定义时间值的对象类型?

谢谢,

安东尼

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

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在您的视图中进行计算