我现在正在定义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来表达?

推荐答案

要处理Django中的一对多关系,需要使用ForeignKey.

有关ForeignKey的文档非常全面,应该可以回答您的所有问题:

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

您示例中的当前 struct 允许每个Dude拥有一个号码,并且每个号码属于多个Dude(与Business相同).

如果你想要反向关系,你需要在你的电话号码模型中添加两个ForeignKey字段,一个是Dude,一个是Business.这将允许每个数字属于一个花花公子或一个企业,并使花花公子和企业能够拥有多个数字.我想这可能就是你想要的.

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

Django相关问答推荐

在保存新实例之前删除一个实例(Django模型保存方法)

如何根据递归ManyToManyField值创建Django查询集?

如何在Django中显示多个相关对象

Django-表单(ModelForm)中的数据不保存在现有数据库中

Django 根据子级过滤父级

如何重命名标准 django-registration 模板的名称

- 不支持的操作数类型:DateField和DateField

在 settings.py 中指定 Django 测试数据库名称

如何使用 jQuery 建立 Django 网站

如何在 django 中处理这种竞争条件?

Django 自定义管理器 - 如何仅返回登录用户创建的对象?

删除所有表的django命令是什么?

是否可以将 FastAPI 与 Django 一起使用?

在 Django 中使用 AuthenticationForm

CSS 文件中的 Django 媒体 URL

ImportError:升级到 Django 4.0 后无法从 'django.conf.urls' 导入名称 'url'

如何在 Django 中执行批量插入?

更改 Django ModelChoiceField 以显示用户的全名而不是用户名

暂时禁用 Django 缓存

如何使用 Django/nginx 部署仅限 HTTPS 的站点?