1. ホーム
  2. ジャンゴ

[解決済み】Djangoで一対多の関係を表現する方法は?

2022-04-07 13:35:32

質問

今、Django のモデルを定義しているところなのですが、そのモデルには OneToManyField をモデルフィールドの種類に追加しました。やり方はあると思うので、何が足りないのかよくわからないのですが。私は本質的にこのようなものを持っています。

class Dude(models.Model):
    numbers = models.OneToManyField('PhoneNumber')

class PhoneNumber(models.Model):
    number = models.CharField()

この場合、各 Dude は、複数の PhoneNumber の関係は一方向でなければなりません。 PhoneNumber どの Dude を所有する多くの異なるオブジェクトを持つかもしれないので、それ自体は、それを所有しています。 PhoneNumber のインスタンスのように Business を例にとると

class Business(models.Model):
    numbers = models.OneToManyField('PhoneNumber')

何を置き換えるかというと OneToManyField (これは存在しません) を使って、この種のリレーションシップを表現することはできますか? 私はHibernate/JPAから来たのですが、1対多の関係を宣言するのはとても簡単でした。

@OneToMany
private List<PhoneNumber> phoneNumbers;

Djangoでこれを表現するにはどうしたらいいでしょうか?

どのように解決するのですか?

Djangoで一対多のリレーションシップを扱うには ForeignKey .

ForeignKeyに関するドキュメントは非常に包括的で、あなたが持つすべての疑問に答えてくれるはずです。

https://docs.djangoproject.com/en/3.2/ref/models/fields/#foreignkey

現在の例の構造では、各Dudeは1つの番号を持ち、各番号は複数のDudeに属することができます(Businessも同じです)。

逆の関係が必要な場合は、PhoneNumberモデルに2つのForeignKeyフィールドを追加し、1つはDudeに、もう1つはBusinessに追加する必要があります。これにより、各番号は1人のDudeまたは1つのBusinessに所属し、DudeとBusinessは複数の番号を所有することができます。これは、あなたが求めているものだと思います。

class Business(models.Model):
    ...
class Dude(models.Model):
    ...
class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)
    business = models.ForeignKey(Business)