• Django模型中的OneToOneField和ForeignKey有什么区别?


    转自:Django模型中的OneToOneField和ForeignKey有什么区别?

    在stackoverflow发了个帖子问这个问题(http://stackoverflow.com/questions/5870537/whats-the-difference-between-django-onetoonefield-and-foreignkey),马上就有人回复了:

    说是ForeignKey是one-to-many的,并举了一个车的例子:

    有两个配件表,一个是车轮表,另一个是引擎表。两个表都有一个car字段,表示该配件对应的车。
    对于车轮来说,多个对应一个car的情况很正常,所以car字段应该用ForeignKey来表示。
    对于引擎来说,一个引擎只可能对应一个car,所以必须用OneToOneField。

    OneToOneField(someModel) 可以理解为 ForeignKey(SomeModel, unique=True)。

    两者的反向查询是有差别的:

    ForeignKey反向查询返回的是一个列表(一个车有多个轮子)。

    OneToOneField反向查询返回的是一个模型示例(因为一对一关系)。

    另外的补充说明:

    另外的补充说明:

    请注意,OneToOneField(SomeModel) 和之间存在一些差异 ForeignKey(SomeModel, unique=True)。如《 Django权威指南》所述 :

    一对一

    一对一的关系。从概念上讲,这与ForeignKey with 相似 unique=True,但是关系的“反向”侧将直接返回单个对象。

    OneToOneField “反向”关系相反, ForeignKey “反向”关系返回a QuerySet

    例如,如果我们有以下两个模型(下面的完整模型代码):

    1. Car 模型用途 OneToOneField(Engine)
    2. Car2 模型用途 ForeignKey(Engine2, unique=True)

    从内部 python manage.py shell 执行以下操作:

    OneToOneField

    >>> from testapp.models import Car, Engine
    >>> c = Car.objects.get(name='Audi')
    >>> e = Engine.objects.get(name='Diesel')
    >>> e.car
    <Car: Audi>
    

    ForeignKeyunique=True 例子

    >>> from testapp.models import Car2, Engine2
    >>> c2 = Car2.objects.get(name='Mazda')
    >>> e2 = Engine2.objects.get(name='Wankel')
    >>> e2.car2_set.all()
    [<Car2: Mazda>]
    

    型号代码

    from django.db import models
    class Engine(models.Model):
        name = models.CharField(max_length=25)
        def __unicode__(self):
            return self.name
    
    
    class Car(models.Model):
        name = models.CharField(max_length=25)
        engine = models.OneToOneField(Engine)
        def __unicode__(self):
            return self.name
    
    
    class Engine2(models.Model):
        name = models.CharField(max_length=25)
        def __unicode__(self):
            return self.name
    
    
    
    class Car2(models.Model):
        name = models.CharField(max_length=25)
        engine = models.ForeignKey(Engine2, unique=True)
        def __unicode__(self):
            return self.name
    
  • 相关阅读:
    Java-死锁
    Java使用Redis
    MySQL如何开启慢查询
    VGG
    如何使用Soft-NMS实现目标检测并提升准确率
    非极大值抑制(NMS)
    迁移学习与fine-tuning有什么区别
    Keras-在预训练好网络模型上进行fine-tune
    Kotlin——初级篇(六):空类型、空安全、非空断言、类型转换等特性总结
    Kotlin——初级篇(五):操作符与操作符重载一
  • 原文地址:https://www.cnblogs.com/bailongcaptain/p/13288705.html
Copyright © 2020-2023  润新知