如何在Django中expression一对多的关系
我现在正在定义我的Django模型,并且我意识到模型字段types中没有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')
我将在模型中replaceOneToManyField
(哪个不存在)来表示这种关系? 我来自Hibernate / JPA,声明一对多的关系如下所示:
@OneToMany private List<PhoneNumber> phoneNumbers;
我怎样才能expression这个在Django?
要在Django中处理一对多的关系,你需要使用ForeignKey
。
关于ForeignKey的文档非常全面,应该回答你所有的问题:
https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey
您示例中的当前结构允许每个Dude有一个数字,每个数字属于多个Dudes(与Business相同)。
如果您想要反向关系,则需要将两个ForeignKey字段添加到您的PhoneNumber模型中,一个Dude和一个Business。 这将允许每个数字属于一个老兄或一个企业,并且有Dudes和企业能拥有多个数字。 我想这可能是你以后的事情。
class Business(models.Model): ... class Dude(models.Model): ... class PhoneNumber(models.Model): dude = models.ForeignKey(Dude) business = models.ForeignKey(Business)
在Django中,一对多关系称为ForeignKey。 然而,它只能在一个方向上工作,所以不需要具有Dude
类的number
属性
class Dude(models.Model): ... class PhoneNumber(models.Model): dude = models.ForeignKey(Dude)
许多模型可以有一个ForeignKey
到另一个模型,所以它是有效的有PhoneNumber
这样的第二个属性
class Business(models.Model): ... class Dude(models.Model): ... class PhoneNumber(models.Model): dude = models.ForeignKey(Dude) business = models.ForeignKey(Business)
您可以使用d.phonenumber_set.objects.all()
访问Dude
对象d
的PhoneNumber
,然后对Business
对象执行类似的操作。
你可以在OneToMany
关系的许多方面(即ManyToOne
关系)使用外键,或者使用具有唯一约束的ManyToMany
(在任何一方)。