我现在正在定义我的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,在那里声明一对多关系非常简单:

@OneToMany
private List<PhoneNumber> phoneNumbers;

如何在Django中表达这一点?


当前回答

尽管这里的大多数答案在定义关系时传递了允许您定义OneToManyRelationship的关系,但它们实际上是多对多关系的定义。

下面是一个更准确的实现:

class Dude(models.Model):
    name = models.CharField(max_length=256, unique=True)

class PhoneNumber(models.Model):
    number = models.CharField(max_length=256, unique=True)

class DudePhoneNumbers(models.Model):
    dude = models.ForeignKey(Dude, related_name="phone_number_relations", on_delete=models.CASCADE)
    phone_number = models.OneToOneField(PhoneNumber, related_name="dude_relation", on_delete=models.CASCADE)

其他回答

您可以在多对多关系(即多对一关系)的多个方面使用外键,也可以在具有唯一约束的任何方面使用多对多(在任何方面)。

Django足够聪明。实际上,我们不需要定义oneToMany字段。它将由Django自动生成。我们只需要在相关的表中定义一个foreignKey。换句话说,我们只需要使用foreignKey来定义多对一关系。

class Car(models.Model):
    # wheels = models.oneToMany() to get wheels of this car [**it is not required to define**].


class Wheel(models.Model):
    car = models.ForeignKey(Car, on_delete=models.CASCADE)  

如果我们想获取特定汽车的车轮列表,我们将使用Python的自动生成对象wheel_set。对于汽车c,您将使用c.wheel_set.all()。

尽管这里的大多数答案在定义关系时传递了允许您定义OneToManyRelationship的关系,但它们实际上是多对多关系的定义。

下面是一个更准确的实现:

class Dude(models.Model):
    name = models.CharField(max_length=256, unique=True)

class PhoneNumber(models.Model):
    number = models.CharField(max_length=256, unique=True)

class DudePhoneNumbers(models.Model):
    dude = models.ForeignKey(Dude, related_name="phone_number_relations", on_delete=models.CASCADE)
    phone_number = models.OneToOneField(PhoneNumber, related_name="dude_relation", on_delete=models.CASCADE)

一对多关系意味着一个模型记录可以有许多其他与它相关联的模型记录。

from django.db import models

class Menu(models.Model):
    name = models.CharField(max_length=30)

class Item(models.Model):
    menu = models.ForeignKey(Menu)
    name = models.CharField(max_length=30)
    description = models.CharField(max_length=100)

要在Django中处理一对多关系,你需要使用ForeignKey。

关于ForeignKey的文档是非常全面的,应该回答你所有的问题:

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

示例中的当前结构允许每个Dude拥有一个数字,并且每个数字属于多个Dude(与Business相同)。

如果你想要相反的关系,你需要给PhoneNumber模型添加两个ForeignKey字段,一个给Dude,一个给Business。这将允许每个号码属于一个人或一个企业,并使人和企业能够拥有多个号码。我觉得这可能就是你要找的东西。

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