使用一对一关系实现一对多关系,没有循环依赖

Posted

技术标签:

【中文标题】使用一对一关系实现一对多关系,没有循环依赖【英文标题】:Implement one-to-many relation with one-to-one relation without circular dependency 【发布时间】:2021-03-25 19:00:14 【问题描述】:

我有两个模型,UserCompany,其中公司可能有多个用户和一个所有者(也是一个用户)。一个用户只能与一个公司关联。现在我的问题是,我应该如何维护任何公司的所有者?因为如果我在 Company 模型中使用任何一对一的关系字段,那么它会给我 circular-dependency 错误,因为我的 User 模型中有 foreign-key 关系字段. 型号如下:

用户模型

class User(BaseMixin, AbstractUser, BlameableMixin):
    """Extends django user with extra optional fields."""

    role = models.ManyToManyField(Role)
    company = models.ForeignKey(
        Company,
        related_name='user_company_map',
        on_delete=models.SET_NULL,
        null=True,

    )
    designation = models.CharField(max_length=max_length_medium, blank=True, unique=False)
    mobile_no = models.CharField(max_length=max_length_medium, blank=False, unique=False)
    organization = models.CharField(max_length=max_length_medium, blank=False, unique=False)

公司模式

class Company(BaseMixin, BlameableMixin):
    """Company detail."""

    name = models.CharField(max_length=max_length_large, blank=True, unique=False)
    code_name = models.CharField(max_length=max_length_large, blank=True, unique=True)
    domain = models.CharField(max_length=max_length_large, blank=True)

如上面的代码所示,我在 User 模型上有一个外键字段,它将我的 User 模型连接到 Company 模型。 p>

现在我想要一个字段来帮助我跟踪作为任何特定公司所有者的用户。如果您提供django-orm 查询以获取公司对象及其用户和所有者,这也将非常有帮助。我还想查询一个用户及其相关公司,以及他/她是否是这家公司的所有者。

注意:我希望在 Company 模型中有 owner 字段,但如果根据我的要求它应该在 User 模型中,我不介意。我只是在寻找解决方案。任何建议表示赞赏。谢谢

【问题讨论】:

也许这会有所帮助 - ***.com/questions/30204409/… 【参考方案1】:

Django 允许您将 ForeignKeyto 参数指定为字符串 (https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey),这将使您能够在 Django ORM 中创建关系

class Company(BaseMixin, BlameableMixin):
    """Company detail."""

    name = models.CharField(max_length=max_length_large, blank=True, unique=False)
    code_name = models.CharField(max_length=max_length_large, blank=True, unique=True)
    domain = models.CharField(max_length=max_length_large, blank=True)
    owner = models.OneToOne("User", related_name="owner_of")

然后您可以直接从公司对象company_object.owner 访问所有者。通过user_object.company 访问特定用户的公司。您还可以通过user_object.owner_of访问用户拥有的公司。

【讨论】:

以上是关于使用一对一关系实现一对多关系,没有循环依赖的主要内容,如果未能解决你的问题,请参考以下文章

观察者模式解析

具有一对多关系的 GraphQL 循环查询

观察一对多关系中的依赖键

Swift如何实现通用类型的弱引用数组(下)

观察者模式

观察者模式