django基础 -- 6. 多表操作

一.多表的创建

from django.db import models

# Create your models here.
class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    au = models.OneToOneField(to='AuthorDetail',to_field='id')  # 一对一表的创建

class AuthorDetail(models.Model):
    id = models.AutoField(primary_key=True)
    address = models.CharField(max_length=32)
    tel = models.CharField(max_length=11)

class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    publisher = models.ForeignKey(to='Publish',to_field='id',on_delete=models.CASCADE)  
       # 一对多表的创建 authors
= models.ManyToManyField(to='Author')  # 多对多表的创建 (方法一) 自行创建第三张表 # # class Book2Author(models.Model):       # 多对多表的创建 (方法二) ORM的一些功能不能使用 # id = models.AutoField(primary_key=True) # book = models.ForeignKey(to='Book',to_field='id') # author = models.ForeignKey(to='Author',to_field='id')
①  创建一对一关系字段时的一些参数

to
    设置要关联的表。

to_field
    设置要关联的字段。
    
on_delete
    同ForeignKey字段。
②  创建一对多关系字段时的一些参数

to
    设置要关联的表

to_field
    设置要关联的表的字段

related_name
    反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。
related_query_name
    反向查询操作时,使用的连接前缀,用于替换表名。

on_delete
    当删除关联表中的数据时,当前表与其关联的行的行为。
③ 多对多的参数:
    to
        设置要关联的表

    related_name
        同ForeignKey字段。

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

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

    through_fields
        设置关联的字段。

    db_table
        默认创建第三张表时,数据库中表的名称。            
 ④ .创建表时的一些元信息设置
   
     ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:
class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")
    class Meta:
        unique_together = ("author", "book")

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

index_together
    联合索引。

unique_together
    联合唯一索引。

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

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

创建表时的一些元信息设置
⑥  关于on_delete

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(可执行对象) 关于on_delete参数
注意事项:

 1.  表的名称myapp_modelName,是根据 模型中的元数据自动生成的, 
      也可以覆写为别的名称 
  2. id 字段是自动添加的
3. 对于外键字段,Django 会在字段名上添加
"_id" 来创建数据库中的列名
4.这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,
  要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。
5. 定义好模型之后,你需要告诉Django _使用_这些模型。
  你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。 6.外键字段 ForeignKey 有一个 null
=True 的设置(它允许外键接受空值 NULL),
    你可以赋给它空值 None 。 7. 咱们的表里面包含了一对一、一对多、多对多的关系,我们基于这几个表来练习,
    将来无论有多少张表,都逃脱不了这三个关系,操作起来都是一样的。

二.  添加表记录(关联表)

  1.多对一表记录的添加

  

  

  2.一对一表记录的添加 (与多对多相同)

  

  

  3.多对多表记录的添加

  

三.基于对象的跨表查询

  

   正向通过 连接字段  ,反向 通过 表

   1.  一对一 查询

   2. 一对多 查询

   3.多对多  查询

 

猜你喜欢

转载自www.cnblogs.com/sc-1067178406/p/10451486.html