1

モデルクラスのDateFieldを別のモデルクラスのForeignKeyとして使用しようとしていて、両方のクラスでdefaultをtodayに設定しようとすると問題が発生します。エラーメッセージは次のとおりです。Django Models:DateFieldをForeignKeyとして使用するときのエラー

django.core.exceptions.ValidationError: ["'self.date' value has an invalid date format. It must be in YYYY-MM-DD format."]

コード:

class DailyImage(models.Model): 
    date = models.DateField(auto_now_add=True, unique=True) 
    name = models.CharField(max_length = 1000) 
    image = models.CharField(max_length = 1000) 
    location = models.CharField(max_length = 1000) 

    def __str__(self): 
     return str(self.id) + ": " + self.name + ", " + self.location 

class JournalEntry(models.Model): 
    date = models.DateField(auto_now_add=True) 
    journal = models.CharField(max_length = 5000) 
    image = models.ForeignKey(DailyImage, to_field='date', default='self.date') 

サイトの毎日の日記です。毎日、unsplash.itの画像をDailyImageクラスに追加します。DailyImageクラスは、ホームページのヘッダーとして表示され、その日に作成された仕訳入力のページのヘッダーとして表示されます。ジャーナルエントリが作成されると、その日に作成されたイメージを自動的に参照する必要があります。

シェルでそれをテストし、日付フィールドが一致するように見えるが、としてフォーマットされていますdatetime.date(YYYY、MM、DD)

>>> a = JournalEntry.objects.get(pk=1) 
>>> a 
<JournalEntry: test> 
>>> a.date 
datetime.date(2016, 11, 7) 
>>> from journal.models import DailyImage as image 
>>> b = image.objects.get(pk=1) 
>>> b.date 
datetime.date(2016, 11, 7) 
>>> b.date == a.date 
True 

これが適切に行われるべきかに任意の提案を大幅になります感謝!

答えて

1

a.dateはdatetimeオブジェクトを返しますが、フォーマットを設定する必要があります。

t = datetime.date(2016, 11, 7) 
t.strftime("%Y-%m-%d") 
# '2016-11-07' 

私はそれがあなたの状況では解決策になるかわからないしかし、あなたはsettings.py

DATETIME_FORMAT = 'Y-m-d' 

にデフォルトの日時書式をも設定することができます。

+0

すばやくお返事ありがとうございます。これらのどれも私のために働くようには思われなかった。代わりに、私は新しい変数today = datetime.today.strftime( "%Y-%m-%d")を作成し、それを画像フィールドに割り当てました: > image = models.ForeignKey(DailyImage、to_field = 'date' 、default = 'today') まだ正常に動作しているかどうかはまだテストされていませんが、これまでのところOKです。 – user2339709

+0

'to_field = 'date''(デフォルト) 'id'によって自動的にリンクされます。あなたがやっていることは非常に珍しいことです。また、ジャーナルを通して既に利用可能なので、「イメージの日付」を省略することもできます。 – FeedTheWeb

+0

そして、その間に、Foreignkey(1対多)の代わりにOneToOneFieldを使用してみてください。 – FeedTheWeb

関連する問題