一尘不染

如何在Django中表达一对多关系

django

我现在正在定义Django模型,我意识到OneToManyField模型字段类型中没有。我确定有办法做到这一点,所以我不确定我缺少什么。我基本上有这样的事情:

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

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

在这种情况下,每个Dude可以有多个PhoneNumberS,但这种关系应该是单向的,因为我不需要从知道PhoneNumberDude拥有它本身,因为我可能有许多不同的对象自身的PhoneNumber情况下,如Business为例:

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

我将OneToManyField用模型中的什么替换(不存在)以表示这种关系?我来自Hibernate / JPA,在这里声明一对多关系非常简单:

@OneToMany
private List<PhoneNumber> phoneNumbers;

如何在Django中表达?


阅读 380

收藏
2020-03-27

共1个答案

一尘不染

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

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

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

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

如果需要反向关系,则需要在PhoneNumber模型中添加两​​个ForeignKey字段,其中一个添加到Dude,另一个添加到Business。这样一来,每个号码都可以属于一个Dude或一个公司,并且Dudes和Businesses可以拥有多个号码。我认为这可能是你追求的目标。

class Business(models.Model):
    ...
class Dude(models.Model):
    ...
class PhoneNumber(models.Model):
    dude = models.ForeignKey(Dude)
    business = models.ForeignKey(Business)
2020-03-27