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

は、ユーザーが時間の値を定義できますPRODUCT_TYPEオブジェクト型を作成する方法はありますか?

おかげで、

アンソニー

答えて

4

私はちょうど2つの値、1つの数値と数が何を表すかのための選択を保存するために容易になると思います。

あなたはメソッドとして、そのモデルに有効期限を計算することができ、あなたは別のサブスクリプションモデルを持っていると仮定すると
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

この例では、durationオブジェクトは単に数値を格納するだけです。 Djangoの管理者には、数字のボックスが表示されます。 次に、duration_typeオブジェクトには文字列が格納され、管理者には2つの選択肢があります。 この時点までに、サブスクリプションの期限が切れたときの計算方法を教えてください。数字と日付を含む計算を実行できますか?そして、duration_typeに格納する文字列は、datetimeFieldとやりとりするためにどのように使用されますか? –

+0

データモデルが適切かどうかはわかりませんが、製品の特定の購入の開始/終了を担当する個別のSubscriptionがある場合、Subscriptionの方法として有効期限を計算できます。私の編集を参照してください。 – AdamKG

+0

ありがとうAdamKG、私はこれを接続し、それがどのように動作するかをお知らせします。私はDjangoのこのトピックについて驚くほど少ししか見つからなかったので、私は本当にリードに感謝します。 –

0

あなたは、サブスクリプションの開始と終了を記述したいくつかのDateTimeモデルフィールドを追加することができます。あなたの意見

で計算を行うためにそのはtimedeltaを使用することができます

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

:あなたは、例えば、他の

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 

から1つの日時を差し引いてはtimedeltaを返すモデルのメソッドを作成することができます

+0

は、私は右のあなたを理解していますことを確認するには、次の2行: subscription_start = models.DateTimeField() subscription_end = models.DateTimeField() –

+0

私はあなたを右に理解していますことを確認するには... をこの応答を繰り返しますが、申し訳ありませんこれらの行はDjango管理者のカレンダーツールと時間ツールとして表示されず、管理者が特定の日付を選択できるようになっています(これらの行はDjango管理者には表示されません)。そして時間?私は管理者に、変数であるユーザサインアップのためにdatetimeFieldに縛られている時間を選択する方法を与える必要があります。 –

+0

これを明確にするために、これは最初の日付ピッカーを作成し、管理フォームの終わりのものを作成し、素晴らしいDjangoフォーム要素を利用します。保存すると、データは2つのdatetimes、例えば 'product.subscription_start'またはtimeleltaのように' product.get_duration() 'のように取り出すことができます timedeltaオブジェクトにアクセスできるということは、モデルについてのデータとプレゼンテーションに関するビューを保持しています。例えば '>>> from datetime import timedelta >>> d = timedelta(days = 1) >>>(d.days、d.seconds、d.microseconds)' – errkk

関連する問題