【问题标题】:Django - one to one relation, mostly NULLs at one end, NOT NULL on the otherDjango - 一对一关系,一端大多为 NULL,另一端为 NOT NULL
【发布时间】:2014-11-19 21:31:26
【问题描述】:

我正在使用 Django 和 PostgreSQL 编写简单的应用程序来管理一个家庭图书库,在那里我可以为借书的人提供许多借书人资料(Borrower 模型)。而且我有用户,他们可以自己借书,这样图书就会被用户的借书人资料借阅。

另一方面,管理员可以将书籍借给任何借阅者,甚至可以借给未注册的用户。

所以我有几个MyUsers(顺便说一句,那个字段引用了Django的User)和许多Borrowers,我想在它们之间创建一对一的关系,但是每个@ 987654325@ 已经 引用了一个唯一的Borrower,但许多Borrowers 不会引用任何现有的MyUsers(它们只能引用一个或没有,或者换句话说,被引用只有一个用户或没有用户)。

我的问题是:如何进行最佳建模?使用models.OneToOneFieldmodels.ForeignKey,哪个模型应该引用哪个?

我可能会有很多没有用户帐户的借款人。

User 模型中的自然解决方案似乎是 OneToOneField(Borrower, null=False)。但是当基于借款人搜索用户时,我将不得不主要处理DoesNotExists 异常,并且只有偶尔我会得到正确的结果。

我也可以创建ForeignKey(Borrower, unique=True, null=False) - 然后我将不得不检查具有单个元素或空的集合。

我可以同时使用ForeignKeys:

class Borrower(models.Model):
    # ...
    user = models.ForeignKey(MyUser, unique=True, null=True)

class MyUser(models.Model):
    # ...
    borrower = models.ForeignKey(Borrower, unique=True, null=False)

这隐含地定义了关系,我可以轻松地进行双向搜索,但它也在数据库表中产生了一个额外的冗余字段。

我现在可能只会坚持使用OneToOneField,但我想知道在这种情况下哪种方法最有意义。有什么好处和坏处?还有其他更好的解决方案吗?

【问题讨论】:

    标签: python django postgresql django-models


    【解决方案1】:

    我会坚持使用OneToOneField;正如您所说,这是最自然的解决方案。

    您提到的唯一缺点是borrower.user 可以引发DoesNotExist 异常。如果你不喜欢这样,你总是可以定义你自己的方法(或属性)来返回其他东西(比如None)。比如:

    class MyUser(models.Model):
        borrower = models.OneToOneField(Borrower, null=False)
    
    class Borrower(models.Model):
        @property
        def user(self):
            try:
                return self.myuser
            except DoesNotExist:
                return None
    
        @user.setter
        def user(self, user):
            self.myuser = user
    

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2012-11-26
      • 2019-07-24
      • 2015-05-28
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      相关资源
      最近更新 更多