見出し画像

django m2mの一歩先へパート2 through_fields

前回はthroughで中間テーブルを自作しようという話をしましたが、こんな場合もあります。

たとえば、中間テーブルからPersonのモデルから二つフィールドをとってきたいとしましょう。たとえば、メールの受信者と送信者といった場合、こんな感じになるでしょうか。

class Message(models.Model):
   """チーム"""
   name = models.CharField("チーム名", max_length=100)
   members = models.ManyToManyField(
       "Person",
       through="PersonRelation"
   )
   
class PersonRelation(models.Model):
   """人とチームの中間テーブル"""
   receuver = models.ForeignKey("Person", on_delete=models.CASCADE)
   sender = models.ForeignKey("Person", on_delete=models.CASCADE)

receiverフィールドとsenderフィールドがどちらもPersonモデルを参照しています。 こうなった場合、Djangoはどちらのフィールドを使って多対多の関係を作って良いかが判別できなくなり、エラーとなってします。

エラーを防ぐためには、次のようにthrough_fieldsを使います。

class Message(models.Model):
   """チーム"""
   name = models.CharField("チーム名", max_length=100)
   members = models.ManyToManyField(
       "Person",
       through="PersonRelation",
       through_fields=("team", "person")  # 追加
   )
   
class PersonRelation(models.Model):
   """人とチームの中間テーブル"""
   receuver = models.ForeignKey("Person", on_delete=models.CASCADE)
   sender = models.ForeignKey("Person", on_delete=models.CASCADE, )

これで二つのフィールドから同じモデルを参照してもエラーが出なくなります。

この記事が気に入ったらサポートをしてみませんか?