Python Django-一对一关系,一端大部分为空,另一端不为空

Python Django-一对一关系,一端大部分为空,另一端不为空,python,django,postgresql,django-models,Python,Django,Postgresql,Django Models,我正在用Django和PostgreSQL编写一个简单的应用程序,用于管理一个家庭图书库,在这里我可以为借书的人提供许多借书人配置文件(借书人模型)。我有一些用户,他们可以自己借书,这样书就可以通过用户的借书人档案借来了 另一方面,管理员可以将书籍借给任何借款人,甚至是未注册用户 因此,我有一些MyUsers(顺便说一句,该字段引用Django的User)和许多借用者,我想在它们之间建立一对一的关系,但每个MyUser都必须引用一个唯一的借用者,但许多借款人s不会引用任何现有的MyUsers(他

我正在用Django和PostgreSQL编写一个简单的应用程序,用于管理一个家庭图书库,在这里我可以为借书的人提供许多借书人配置文件(
借书人
模型)。我有一些用户,他们可以自己借书,这样书就可以通过用户的借书人档案借来了

另一方面,管理员可以将书籍借给任何借款人,甚至是未注册用户

因此,我有一些
MyUser
s(顺便说一句,该字段引用Django的
User
)和许多
借用者
,我想在它们之间建立一对一的关系,但每个
MyUser
都必须引用一个唯一的
借用者
,但许多
借款人
s不会引用任何现有的
MyUser
s(他们只能引用一个或一个,或者换句话说,只能被一个或没有用户引用)

我的问题是:如何优化建模?使用
models.OneToOneField
models.ForeignKey
以及哪个模型应该引用哪个

我可能会有很多借款人,他们没有用户帐户

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

我还可以设置
ForeignKey(借用者,unique=True,null=False)
——然后我必须检查具有单个元素或空元素的集合

我可以通过两种方式制作
ForeignKey
s:

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
,但我想知道在这种情况下哪种方法最有意义。程序和缺点是什么?还有其他更好的解决方案吗?

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

您提到的唯一缺点是,
forrower.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