2017-02-07 4 views
0

Django docsによれば、博物館アプリケーションの人と日付の関係を作成しました。 (削除不要なフィールドを持つ)Django多対多照会all()は空集合を返します

まずモデル:次に

class Agent(models.Model): 
    name = models.CharField(max_length=255) 
    dates = models.ManyToManyField(HistoricDate, 'date_for_agent', models.CASCADE, through='AgentDateType') 
    . . . . 

class HistoricDate(models.Model): 
    display = models.CharField(max_length=255, help_text='Textual representation of date') 
    earliest = models.CharField(max_length=15, blank=True) 
    earliest_accuracy = models.BooleanField(default=False, verbose_name="circa") 
    latest = models.CharField(max_length=15, blank=True) 
    latest_accuracy = models.BooleanField(default=False, verbose_name="circa") 

class AgentDateType(models.Model): 
    datation = models.ForeignKey(HistoricDate, models.PROTECT) 
    dated = models.ForeignKey(Agent, models.CASCADE) 
    date_type = models.CharField(max_length=31, choices=date_types) 
    . . . . 

試験:、ただし

AgentDateType.objects.all() 
c_life.date_for_agent.all() 
c_act.date_for_agent.all() 

caesar = Agent.objects.create(name="Gaius Julius Caesar", name_type="personal", culture="Ancient Rome", display="Julius Caesar (Roman, 100–44 B.C.)") 
c_life = HistoricDate.objects.create(display="13 July 100–15 March 44 B.C.", earliest="-100-07-13", earliest_accuracy=False, latest="-44-03-15", latest_accuracy=False) 
c_act = HistoricDate.objects.create(display="60–44 B.C.", earliest="-60", earliest_accuracy=False, latest="-44-03-15", latest_accuracy=False) 

caesar_lives = AgentDateType.objects.create(dated=caesar, datation=c_life, source="Suetonius, Lives of the Caesars", date_type="life") 
caesar_acts = AgentDateType.objects.create(dated=caesar, datation=c_act, source="Livy", date_type="activity") 

を、以下のクエリが予想セットを返しますcaesar.dates.all()は、最も簡単なはずですが、空のセットを返します。何がありますか?

答えて

1

DjangoのManyToManyFieldは、指定した順番でない定位置引数をとります。 source for M2Mを参照してください。私はあなたがキーワード引数を使うことをお勧めします。

+0

ありがとうございます! ManyToManyFieldが 'on_delete'引数を受け入れないという事実には注意を払っていませんでした。 2番目の考えでは、それはコンセプトから明らかです... –

+1

実際にカスケード効果を持たせたいのであれば(どのユースケースがあるのか​​分かりませんが)、あなたは 'through'テーブルを使ってそれを強制する。 –

関連する問題