首页  >  文章  >  后端开发  >  何时在 Django 中选择 `OneToOneField()` 与 `ForeignKey(unique=True)` ?

何时在 Django 中选择 `OneToOneField()` 与 `ForeignKey(unique=True)` ?

Barbara Streisand
Barbara Streisand原创
2024-11-07 03:23:02120浏览

When to Choose `OneToOneField()` vs `ForeignKey(unique=True)` in Django?

比较Django的OneToOneField()和ForeignKey()

Django提供了两种在模型之间建立关系的主要机制:OneToOneField()和ForeignKey( )。虽然两者都允许一对一关联,但它们的行为和结果有所不同。

OneToOneField() 和foreignKey(unique=True)

本质上, OneToOneField(SomeModel) 在功能上类似于ForeignKey(SomeModel, unique=True)。在这两种情况下,您都可以在对象之间强制执行唯一的关系。但是,有一个微妙的区别:

OneToOneField 提供双向关系,其中检索“反向”端的对象直接返回相应的单个对象。

car = Car.objects.get(name='Audi')
engine = car.engine # Returns the corresponding Engine object directly

ForeignKey 与 unique=True 另一方面,保持单向关系。在“反向”端检索对象会返回一个 QuerySet。

car2 = Car2.objects.get(name='Mazda')
engines = car2.engine2_set.all() # Returns a QuerySet containing the corresponding Engine2 object

示例插图

考虑两个模型:Car 和 Engine,其中 Car 使用 OneToOneField() Car2 使用ForeignKey(unique=True)。执行以下代码演示了差异:

# OneToOneField
car = Car.objects.get(name='Audi')
engine = Engine.objects.get(name='Diesel')
print(engine.car)  # Prints "Audi"

# ForeignKey with unique=True
car2 = Car2.objects.get(name='Mazda')
engine2 = Engine2.objects.get(name='Wankel')
print(engine2.car2_set.all())  # Prints "[<Car2: Mazda>]"

参考模型代码

class Engine(models.Model):
    name = models.CharField(max_length=25)

class Car(models.Model):
    name = models.CharField(max_length=25)
    engine = models.OneToOneField(Engine)

class Engine2(models.Model):
    name = models.CharField(max_length=25)

class Car2(models.Model):
    name = models.CharField(max_length=25)
    engine = models.ForeignKey(Engine2, unique=True)

选择正确的关系

最终,OneToOneField() 和ForeignKey() 之间的选择取决于您的具体数据模型和用例。如果您需要真正的一对一关系,并且必须直接访问单个反向对象,那么建议使用 OneToOneField()。对于需要复杂查询或最终需要“反向”多对象关系的情况,使用 unique=True 的foreignKey() 更合适。

以上是何时在 Django 中选择 `OneToOneField()` 与 `ForeignKey(unique=True)` ?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn