我现在正在定义 Django 模型,我意识到模型字段类型中没有 OneToManyField
。我确信有办法做到这一点,所以我不确定我错过了什么。我基本上有这样的东西:
class Dude(models.Model):
# 1 dude can have 0+ phone numbers
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
在这种情况下,每个 Dude
可以有多个 PhoneNumber
,但关系应该是单向的,因为我不需要知道Dude
本身拥有它的 PhoneNumber
,因为我可能有许多不同的对象拥有 PhoneNumber
实例,例如 Business
例如:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
我要替换什么OneToManyField
(不存在)在模型中表示这种关系?我来自 Hibernate/JPA,其中声明一对多关系就像:
@OneToMany
private List<PhoneNumber> phoneNumbers;
如何在 Django 中表达这一点?
I'm defining my Django models right now and I realized that there wasn't a OneToManyField
in the model field types. I'm sure there's a way to do this, so I'm not sure what I'm missing. I essentially have something like this:
class Dude(models.Model):
# 1 dude can have 0+ phone numbers
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
In this case, each Dude
can have multiple PhoneNumber
s, but the relationship should be unidirectional, in that I don't need to know from the PhoneNumber
which Dude
owns it, per se, as I might have many different objects that own PhoneNumber
instances, such as a Business
for example:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
What would I replace OneToManyField
(which doesn't exist) with in the model to represent this kind of relationship? I'm coming from Hibernate/JPA where declaring a one-to-many relationship was as easy as:
@OneToMany
private List<PhoneNumber> phoneNumbers;
How can I express this in Django?
发布评论
评论(11)
要在 Django 中处理一对多关系,您需要使用
ForeignKey
。关于
ForeignKey
的文档非常全面,应该可以回答您的所有问题:https://docs.djangoproject.com/en/3.2/ref/models/fields/#foreignkey
示例中的当前结构允许每个
Dude
有一个号码,每个号码属于多个Dude
(与Business
相同)。如果您想要相反的关系,则需要将两个
ForeignKey
字段添加到您的PhoneNumber
模型中,一个添加到Dude
,一个添加到商业。这将允许每个号码属于一个
Dude
或一个Business
,并且具有Dude
和Business
es能够拥有多个PhoneNumber
。我想这可能就是你所追求的:To handle One-To-Many relationships in Django you need to use
ForeignKey
.The documentation on
ForeignKey
is very comprehensive and should answer all the questions you have:https://docs.djangoproject.com/en/3.2/ref/models/fields/#foreignkey
The current structure in your example allows each
Dude
to have one number, and each number to belong to multipleDude
s (same withBusiness
).If you want the reverse relationship, you would need to add two
ForeignKey
fields to yourPhoneNumber
model, one toDude
and one toBusiness
. This would allow each number to belong to either oneDude
or oneBusiness
, and haveDude
s andBusiness
es able to own multiplePhoneNumber
s. I think this might be what you're after:在 Django 中,一对多关系称为foreignkey。然而,它只能在一个方向上起作用,因此您不需要使用类
Dude
的number
属性,而是需要许多模型可以有一个
ForeignKey
来另一个模型,因此拥有PhoneNumber
的第二个属性是有效的,这样您就可以访问
Dude
对象的PhoneNumber
<代码>d与d.phonenumber_set.objects.all()
,然后对Business
对象执行类似操作。In Django, a one-to-many relationship is called ForeignKey. It only works in one direction, however, so rather than having a
number
attribute of classDude
you will needMany models can have a
ForeignKey
to one other model, so it would be valid to have a second attribute ofPhoneNumber
such thatYou can access the
PhoneNumber
s for aDude
objectd
withd.phonenumber_set.objects.all()
, and then do similarly for aBusiness
object.更清楚地说 - Django 中没有 OneToMany,只有 ManyToOne - 这就是上面描述的foreignkey。您可以使用外键来描述一对多关系,但这非常不表达。
一篇关于它的好文章:
https:// amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
To be more clear - there's no OneToMany in Django, only ManyToOne - which is Foreignkey described above. You can describe OneToMany relation using Foreignkey but that is very inexpressively.
A good article about it:
https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
姜戈足够聪明。实际上我们不需要定义oneToMany 字段。 Django 会自动为您生成它。我们只需要在相关表中定义一个
foreignKey
即可。换句话说,我们只需要使用foreignKey
定义ManyToOne
关系即可。如果我们想要获取特定汽车的车轮列表,我们将使用Python自动生成的对象
wheel_set
。对于汽车c
,您将使用c.wheel_set.all()
。Django is smart enough. Actually we don't need to define
oneToMany
field. It will be automatically generated by Django for you. We only need to define aforeignKey
in the related table. In other words, we only need to defineManyToOne
relation by usingforeignKey
.If we want to get the list of wheels of particular car, we will use Python's auto generated object
wheel_set
. For carc
you will usec.wheel_set.all()
.您可以在
OneToMany
关系的多方(即ManyToOne
关系)上使用外键,也可以在具有唯一约束的情况下使用ManyToMany
(在任何一方)。You can use either foreign key on many side of
OneToMany
relation (i.e.ManyToOne
relation) or useManyToMany
(on any side) with unique constraint.虽然滚石的答案很好,简单且实用,但我认为它没有解决两件事。
引入内容类型框架,它公开了一些对象,使我们能够在 PhoneNumber 模型上创建“通用外键”。然后,我们可以在 Dude 和 Business 上定义反向关系,
请参阅 docs 有关详细信息,也许可以查看 本文 获取快速教程。
另外,这里有一篇文章,反对 使用通用 FK。
While rolling stone's answer is good, straightforward and functional, I think there are two things it does not solve.
Introduce the content types framework, which exposes some objects that allow us to create a "generic foreign key" on the PhoneNumber model. Then, we can define the reverse relationship on Dude and Business
See the docs for details, and perhaps check out this article for a quick tutorial.
Also, here is an article that argues against the use of Generic FKs.
首先我们浏览一下:
01) 一对多关系:
注意:Django 不提供任何 OneToMany 关系。所以我们不能在Django中使用upper方法。但我们需要在关系模型中进行转换。那么我们能做什么呢?在这种情况下,我们需要将关系模型转换为反向关系模型。
这里:
关系模型= OneToMany
所以,反向关系模型= ManyToOne
注意:Django 支持ManyToOne 关系&在Django ManyToOne中用ForeignKey表示。
02)多对一关系:
注意:简单思考!
First of all we take a tour:
01) one-to-many relationship:
NB: Django doesn't provides any OneToMany relationship. So we can't use upper method in Django. But we need to convert in relational model. So what can we do? In this situation we need to convert relational model into reverse relational model.
Here:
relational model = OneToMany
So, reverse relational model = ManyToOne
NB: Django support ManyToOne relationship & in Django ManyToOne is represented by ForeignKey.
02) many-to-one relationship:
NB: THINK SIMPLY!!
实际上,一对多关系非常有用。我这样做:
这将确保该号码仅使用一次。
Actually, one-to-many relationship is very useful. I do something like this:
This will ensure the number only use once.
尽管这里的大多数答案确实传递了定义允许您定义 OneToManyRelationship 的关系,但它们实际上是 ManyToManyRelationship 的定义。
这是一个更准确的实现:
Whereas most answers here do pass in defining a relationship that allows you to define a OneToManyRelationship, they are actually in fact the definition of a ManyToManyRelationship.
Here is a more accurate implementation:
如果“多”模型本身不能证明创建模型的合理性(这里不是这种情况,但它可能对其他人有利),另一种选择是通过 Django Contrib 包
Postgres 可以处理 数组 或 JSON 数据类型,当许多时,这可能是处理一对多的一个很好的解决方法只能绑定到一个一个的单一实体。
Postgres 允许您访问数组的单个元素,这意味着查询可以非常快,并避免应用程序级开销。当然,Django 实现了一个很酷的 API 利用此功能。
它显然有一个缺点,就是不能移植到其他数据库后端,但我认为它仍然值得一提。
希望它可以帮助一些寻找想法的人。
If the "many" model does not justify the creation of a model per-se (not the case here, but it might benefits other people), another alternative would be to rely on specific PostgreSQL data types, via the Django Contrib package
Postgres can deal with Array or JSON data types, and this may be a nice workaround to handle One-To-Many when the many-ies can only be tied to a single entity of the one.
Postgres allows you to access single elements of the array, which means that queries can be really fast, and avoid application-level overheads. And of course, Django implements a cool API to leverage this feature.
It obviously has the disadvantage of not being portable to others database backend, but I thougt it still worth mentionning.
Hope it may help some people looking for ideas.
一对多关系意味着一个模型记录可以有许多与其自身关联的其他模型记录。
A one to many relationship implies that one model record can have many other model records associated with itself.