使用一对一关系实现一对多关系,没有循环依赖
Posted
技术标签:
【中文标题】使用一对一关系实现一对多关系,没有循环依赖【英文标题】:Implement one-to-many relation with one-to-one relation without circular dependency 【发布时间】:2021-03-25 19:00:14 【问题描述】:我有两个模型,User 和 Company,其中公司可能有多个用户和一个所有者(也是一个用户)。一个用户只能与一个公司关联。现在我的问题是,我应该如何维护任何公司的所有者?因为如果我在 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 允许您将 ForeignKey
的 to
参数指定为字符串 (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
访问用户拥有的公司。
【讨论】:
以上是关于使用一对一关系实现一对多关系,没有循环依赖的主要内容,如果未能解决你的问题,请参考以下文章