ForeignKey(User,unique = True)和OneToOneField之间的区别

Haf*_*fiz 22 django django-models

Django models.ForeignKey(Modelname, unique=True)models.OneToOneFieldDjango有什么不同?

我应该在哪里使用models.OneToOneFieldmodels.ForeignKey(Modelname, unique=True)

Ala*_*air 47

一个OneToOneField非常类似于ForeignKeyunique=True.除非您正在进行多表继承,在这种情况下您必须使用OneToOneField,唯一真正的区别是用于访问相关对象的api.

Django文档中它说:

从概念上讲,这类似于ForeignKeywith unique=True,但关系的"反向"方面将直接返回单个对象.

让我们用一个例子来说明这意味着什么.考虑两个模型,PersonAddress.我们假设每个人都有一个独特的地址.

class Person(models.Model):
    name = models.CharField(max_length=50)
    address = models.ForeignKey('Address', unique=True)

class Address(models.Model):
    street = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

如果您从一个人开始,您可以轻松访问该地址:

address = person.address
Run Code Online (Sandbox Code Playgroud)

但是,如果您从一个地址开始,您必须通过person_set经理来获取该人.

person = address.person_set.get() # may raise Person.DoesNotExist
Run Code Online (Sandbox Code Playgroud)

现在让我们ForeignKey用a 代替OneToOneField.

class Person(models.Model):
    name = models.CharField(max_length=50)
    address = models.OneToOneField('Address')

class Address(models.Model):
    street = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

如果您从一个人开始,您可以以相同的方式访问该地址:

address = person.address
Run Code Online (Sandbox Code Playgroud)

现在,我们可以更轻松地从地址访问此人.

person = address.person # may raise Person.DoesNotExist
Run Code Online (Sandbox Code Playgroud)

  • 可能值得注意的是,Django 会针对 unique=True 的foreignkey字段生成以下警告:“提示:foreignkey(unique=true)通常最好由onetoonefield提供” (2认同)