2012-04-18 46 views
2

我试图设置一个与时间长度相对应的产品(报纸订阅)。什么模型对象类型用于在Django Admin中存储时间值?

我有客户使用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 

有没有什么办法,使产品类型的对象类型,它可以让用户定义的时间价值?

感谢,

安东尼

回答

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) 
+0

所以在这个例子中,持续时间对象只会存储一个数字。在Django管理员中,您只会看到一个数字框。 然后,duration_type对象将存储一个字符串,而管理员将只有两个选择。 一旦我达到这一点,我将如何计算何时订阅已过期?你能否进行涉及数字和日期的计算?我将如何使用duration_type中存储的字符串与datetimeField进行交互? – 2012-04-18 17:01:26

+0

我不确定自己的数据模型是否正确,但如果您有一个单独的订阅,负责特定购买产品的开始/结束,则可以将计算到期日期作为Subscription上的一种方法;看我的编辑。 – AdamKG 2012-04-18 17:17:10

+0

感谢AdamKG,我会将其插入并让你知道它是如何工作的。我对Django的这个主题感到惊讶的很少,所以我非常欣赏这个主题。 – 2012-04-18 17:32:15

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 

减去一个日期时间返回timedelta如:

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

您可以使用timedelta做计算在你的意见

+0

为了确保我理解你的权利,这两行: subscription_start = models.DateTimeField() subscription_end = models.DateTimeField() – 2012-04-18 16:51:20

+0

对不起,重复此响应,但... 为了确保我理解你的权利,这两行: 'subscription_start = models.DateTimeField()' 'subscription_end = models.DateTimeField()' 不会将这些行显示在Django admin中作为日历和时间工具,从而允许管理员选择特定日期和时间?我需要给管理员一个选择与用户注册的datetimeField绑定的时间长度的方法,这是一个变量。 – 2012-04-18 17:05:03

+0

为了澄清,是的,这会在开始时创建日期选择器,并且在管理员表单中使用好的Django表单元素创建日期选择器。当保存时,数据可以作为2个日期时间,例如'product.subscription_start'或者作为timedelta如'product.get_duration()'来获取。访问timedelta对象意味着你可以在视图中输出它,不过你可以在视图中输出它阶段,保持关于数据的模型和关于表达的观点。例如: '>>> from datetime import timedelta >>> d = timedelta(days = 1) >>>(d.days,d.seconds,d.microseconds)' – errkk 2012-04-18 20:42:51

相关问题