Naf*_*Kay 150 django django-models
我正在定义我的Django模型,我意识到OneToManyField模型字段类型中没有.我确定有办法做到这一点,所以我不确定我错过了什么.我基本上有这样的事情:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每个都Dude可以有多个PhoneNumbers,但关系应该是单向的,因为我不需要知道PhoneNumber它Dude拥有它本身,因为我可能有很多不同的对象拥有PhoneNumber实例,例如Businessfor例:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
Run Code Online (Sandbox Code Playgroud)
我会OneToManyField在模型中用什么替换(哪些不存在)来表示这种关系?我来自Hibernate/JPA,宣布一对多的关系就像:
@OneToMany
private List<PhoneNumber> phoneNumbers;
Run Code Online (Sandbox Code Playgroud)
我怎么能在Django中表达这个?
rol*_*one 118
要在Django中处理一对多关系,您需要使用ForeignKey.
关于ForeignKey的文档非常全面,应该回答您的所有问题:
https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey
您的示例中的当前结构允许每个Dude有一个数字,每个数字属于多个Dudes(与Business相同).
如果你想要反向关系,你需要在PhoneNumber模型中添加两个ForeignKey字段,一个到Dude,一个到Business.这将允许每个号码属于一个Dude或一个Business,并且Dudes和Business可以拥有多个Numbers.我想这可能就是你所追求的.
class Business(models.Model):
...
class Dude(models.Model):
...
class PhoneNumber(models.Model):
dude = models.ForeignKey(Dude)
business = models.ForeignKey(Business)
Run Code Online (Sandbox Code Playgroud)
sti*_*ing 36
在Django中,一对多关系称为ForeignKey.但是,它只能在一个方向上工作,所以不需要具有number类Dude所需的属性
class Dude(models.Model):
...
class PhoneNumber(models.Model):
dude = models.ForeignKey(Dude)
Run Code Online (Sandbox Code Playgroud)
许多型号可以有ForeignKey一个其他的模式,所以这将是有效的具有第二属性PhoneNumber,使得
class Business(models.Model):
...
class Dude(models.Model):
...
class PhoneNumber(models.Model):
dude = models.ForeignKey(Dude)
business = models.ForeignKey(Business)
Run Code Online (Sandbox Code Playgroud)
您可以访问PhoneNumber■对于Dude对象d有d.phonenumber_set.objects.all(),然后做一个类似的Business对象.
She*_*hid 17
django足够聪明。实际上我们不需要定义oneToMany字段。它将由django您自动生成:-)。我们只需要foreignKey在相关表中定义即可。换句话说,我们只需要使用 来定义ManyToOne关系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)
Run Code Online (Sandbox Code Playgroud)
如果我们想获得特定汽车的车轮列表。我们将使用python's自动生成的对象wheel_set。对于汽车,c您将使用c.wheel_set.all()
val*_*ame 16
更清楚的是 - Django中没有OneToMany,只有ManyToOne - 这是上面描述的Foreignkey.您可以使用Foreignkey描述OneToMany关系,但这是非常不可思议的.
一篇关于它的好文章:https: //amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
rab*_*eye 13
虽然滚石的回答很好,直接且实用,但我认为有两件事没有解决。
介绍内容类型框架,它公开了一些对象,允许我们在 PhoneNumber 模型上创建“通用外键”。然后,我们可以定义 Dude 和 Business 上的反向关系
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models
class PhoneNumber(models.Model):
number = models.CharField()
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
owner = GenericForeignKey()
class Dude(models.Model):
numbers = GenericRelation(PhoneNumber)
class Business(models.Model):
numbers = GenericRelation(PhoneNumber)
Run Code Online (Sandbox Code Playgroud)
此外,这里是一个文章是论证对使用通用FKS的。
| 归档时间: |
|
| 查看次数: |
164641 次 |
| 最近记录: |