229

OneToManyField現在、Django モデルを定義していますが、モデル フィールド タイプに がないことに気付きました。これを行う方法があると確信しているので、何が欠けているのかわかりません。私は本質的に次のようなものを持っています:

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

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

この場合、それぞれDudeが複数の を持つことができますが、関係は一方向でなければなりません。つまり、 forなどのインスタンスを所有する多くの異なるオブジェクトがある可能性があるため、それを所有するもの自体PhoneNumberから知る必要はありません。例:PhoneNumberDudePhoneNumberBusiness

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

OneToManyFieldこの種の関係を表すために、モデル内の (存在しない) を何に置き換えますか? 私は、1対多の関係を宣言するのが次のように簡単だったHibernate / JPAから来ています。

@OneToMany
private List<PhoneNumber> phoneNumbers;

これをDjangoでどのように表現できますか?

4

10 に答える 10

183

Django で 1 対多の関係を処理するには、 を使用する必要がありますForeignKey

ForeignKey のドキュメントは非常に包括的であり、すべての質問に答える必要があります。

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

あなたの例の現在の構造では、各男が1つの番号を持ち、各番号が複数の男に属することができます(ビジネスと同じ)。

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

class Business(models.Model):
    ...
class Dude(models.Model):
    ...
class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)
    business = models.ForeignKey(Business)
于 2011-08-03T15:41:04.257 に答える
52

Django では、1 対多の関係は ForeignKey と呼ばれます。ただし、一方向にしか機能しないため、必要なnumberクラスの属性を持つのではなく、Dude

class Dude(models.Model):
    ...

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

多くのモデルは他のモデルに対して を持つことができるので、そのようForeignKeyな 2 番目の属性を持つことは有効です。PhoneNumber

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

を使用してオブジェクトの にアクセスし、PhoneNumberオブジェクトDudeに対して同様の操作を行うことができます。dd.phonenumber_set.objects.all()Business

于 2011-08-03T15:44:37.910 に答える