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, )
これで二つのフィールドから同じモデルを参照してもエラーが出なくなります。
この記事が気に入ったらサポートをしてみませんか?