zoukankan      html  css  js  c++  java
  • Django:ORM关系字段

    一,ForeignKey

    外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。

    ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

    1,字段参数

    to

    设置要关联的表

    to_field

    设置要关联的表的字段

    related_name

    反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。

    例如:

    class Classes(models.Model):
        name = models.CharField(max_length=32)
    
    class Student(models.Model):
        name = models.CharField(max_length=32)
        theclass = models.ForeignKey(to="Classes")

    当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

    models.Classes.objects.first().student_set.all()

    当我们在ForeignKey字段中添加了参数 related_name 后,

    class Student(models.Model):
        name = models.CharField(max_length=32)
        theclass = models.ForeignKey(to="Classes", related_name="students")

    当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

    models.Classes.objects.first().students.all()

    related_query_name

    反向查询操作时,使用的连接前缀,用于替换表名。

    on_delete

    当删除关联表中的数据时,当前表与其关联的行的行为。

    models.CASCADE
    删除关联数据,与之关联也删除


    models.DO_NOTHING
    删除关联数据,引发错误IntegrityError


    models.PROTECT
    删除关联数据,引发错误ProtectedError


    models.SET_NULL
    删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)


    models.SET_DEFAULT
    删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)


    models.SET

    删除关联数据,
    a. 与之关联的值设置为指定值,设置:models.SET(值)
    b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

    复制代码
    def func():
        return 10
    
    class MyModel(models.Model):
        user = models.ForeignKey(
            to="User",
            to_field="id",
            on_delete=models.SET(func)
        )
    复制代码

    db_constraint

    是否在数据库中创建外键约束,默认为True。

    二,OneToOneField

    一对一字段。

    通常一对一字段用来扩展已有字段。

    1,字段参数

    to

    设置要关联的表。

    to_field

    设置要关联的字段。

    on_delete

    同ForeignKey字段。

    三,ManyToManyField

    用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。

    1,字段参数

    to

    设置要关联的表

    related_name

    同ForeignKey字段。

    related_query_name

    同ForeignKey字段。

    symmetrical

    仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。

    举个例子:

    class Person(models.Model):
        name = models.CharField(max_length=16)
        friends = models.ManyToManyField("self")

    此时,person对象就没有person_set属性。

    class Person(models.Model):
        name = models.CharField(max_length=16)
        friends = models.ManyToManyField("self", symmetrical=False)

    此时,person对象现在就可以使用person_set属性进行反向查询。

    through

    在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。

    但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。

    through_fields

    设置关联的字段。

    db_table

    默认创建第三张表时,数据库中表的名称。

    2,元信息

    ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:

    db_table

    ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。

    index_together

    联合索引。

    unique_together

    联合唯一索引。

    ordering

    指定默认按什么字段排序。

    只有设置了该属性,我们查询到的结果才可以被reverse()。

  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/kakawith/p/8710409.html
Copyright © 2011-2022 走看看