2012-04-18 48 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

相關問題