我知道 ForeignKeys 和 OneToOneFields 以及 ManyToManyField 是什么,它们是如何工作的,以及何时使用它们。但是,我正在处理一个项目,其关系的许多 部分无法修改。所以,假设 I want to let a user have many phone numbers ,我通常会这样做:
# my_app/models.py
from django.db import models
class User(Model):
...
class PhoneNumber(models.Model):
user = models.ForeignKey(User)
我遇到的问题是我的 PhoneNumber
等效模型来自第三方包,已经填充了记录,并且没有在我自己的应用程序中进行子类化。也就是
# third_party_django_package/models.py
from django.db import models
class PhoneNumber(models.Model):
# This cannot change
# my_app/models.py
from django.db import models
from third_party_django_package.models import PhoneNumber
class User(Model):
# These do not work -- a user can have more than one phone number
phone_number = models.ForeignKey(PhoneNumber)
phone_number = models.OneToOneField(PhoneNumber)
# This is close, but I want a phone number to belong to only one User
phone_numbers = models.ManyToManyField(PhoneNumber, related_name=...)
def clean(self):
# Validating the M2M relation costs extra queries, is slow, and
# is prone to race conditions
这都是伪代码。
不使用 yet another third-party package访问 Django 的内部成员,这使得项目的向前兼容性更差,我还有哪些选项可以使用正确的模式级约束来实现适当的 OneToManyField?
最佳答案
您可以创建另一个中间模型,然后为该模型创建电话号码 OneToOneField,然后在该模型中将 User 定义为 ForeignKey。
class UserPhoneNumber(models.Model):
phone_number = models.OneToOneField(PhoneNumber)
user = models.ForeignKey(User)
虽然有点繁琐,但至少能达到你的要求。
编辑:
正如@Daniel 所说,可以使用 m2m 关系与 through
模型,在字段上使用 unique_together
来做到这一点:
class User(Model):
phone_numbers = models.ManyToManyField(PhoneNumber, through=UserPhoneNumber)
class UserPhoneNumber(Model):
phone_number = models.ForeignKey(PhoneNumber)
user = models.ForeignKey(User)
class Meta:
unique_together = ('phone_number', 'user')
如果您想通过 numbers = user.phone_numbers.all()
查找用户的电话号码,这将使您的生活更轻松。
关于django - 锁定一个模型的 Django 中的 OneToMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34444595/