django - 锁定一个模型的 Django 中的 OneToMany 关系

标签 django

我知道 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/

相关文章:

python - 从 sqlite3 切换到 postgres 后 django 迁移失败

python - django:多对多关系的额外字段是否存在黑魔法?

django - 使用 django-filter 查询多个字段,每个字段都有一个自定义方法

python - 没有这样的表 : auth_user error while logging to/admin/after deploy django app on pythonanywhere

python - 合并来自多个表单 Django 的数据

django - 是否在M2M关系中使用直通模型

Django 管理命令看不到参数?

python - Django:根据作为另一个模型值输入的参数自动选择模型

python - 两个 Web 服务器(带 Django 的 Amazon EC2 和 Google App Engine)之间的安全通信

django - 在 Django 中延迟文件下载的正确方法