zoukankan      html  css  js  c++  java
  • Django框架之ORM多表关联操作

    一、创建基表

    设置了abstract为True的模型类,称之为基表,这样的模型类是专门作为基类来提供公有属性的

    • Model类的内部配置Meta类要设置abstract=True
    # Model类的内部配置Meta类要设置abstract=True,这样的Model类就是用来作为基表
    from django.db import models
    
    class BaseModel(models.Model):
        is_delete = models.BooleanField(default=False)
        create_time = models.DateTimeField(auto_now_add=True)
    
        # 类中在定义一个类就代表是配置,约定俗成都叫Meta
        class Meta:
            # 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
            abstract = True
    
    class Book(BaseModel):
        ...
    

    二、ORM多表关联操作

    '''
    外键所放位置
        一对多:外键放在多的一方
        多对多:外键放在常用的一方
        一对一:外键放在不常用的一方
        外键字段为正向查询字段,related_name是反向查询字段(别名)
    外键如何断关联
        设置外键字段db_constraint=False
    外键间的级联关系
        一对一:作者没了,详情也没:on_delete=models.CASCADE
        一对多:出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING
        一对多:部门没了,员工没有部门(空部门):null=True, on_delete=models.SET_NULL
        一对多:部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT
        多对多:不能设置on_delete
    '''
    

    重点:

    • 一对一外键:应该设置在关联方的表中。因为是先有被关联表,再有关联表。

    • 外键字段为正向查询字段,related_name是反向查询字段(别名)

      author = models.OneToOneField(
          to="Author",related_name="detail",db_constraint=False,
          on_delete=models.CASCADE
      )
      
    • 外键如何断关联:db_constraint=False

    实例:

    class BaseModel(models.Model):
        is_delete = models.BooleanField(default=False)
        create_time = models.DateTimeField(auto_now_add=True)
    
        # 类中在定义一个类就代表是配置,约定俗成都叫Meta
        class Meta:
            # 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
            abstract = True
    
    
    class Book(BaseModel):
        name = models.CharField(max_length=16)
        price = models.DecimalField(max_digits=9,decimal_places=2)
        # 设置外键字段,取反向查除的别名,断开连接,不设置级联删除
        publish = models.ForeignKey(
            to="Publish",related_name="books",db_constraint=False,
            on_delete=models.DO_NOTHING
        )
        # 重点:多对多外键实际在关系表中,ORM默认关系表中两个外键都是级联
        # ManyToManyField字段不提供设置on_delete,如果想设置关系表级联,只能手动定义关系表
        authors = models.ManyToManyField(
            to="Author",related_name="books",db_constraint=False
        )
    
    class Publish(BaseModel):
        name = models.CharField(max_length=16)
        address = models.CharField(max_length=64)
    
    class Author(BaseModel):
        name = models.CharField(max_length=16)
        sex = models.IntegerField(choices=[(0, '男'),(1, '女')], default=0)
    
    class AuthorDetail(BaseModel):
        mobile = models.CharField(max_length=11)
        # 有作者可以没有详情,删除作者,详情一定会被级联删除
        # 外键字段为正向查询字段,related_name是反向查询字段
        author = models.OneToOneField(
            to="Author",related_name="detail",db_constraint=False,
            on_delete=models.CASCADE
        )
    
  • 相关阅读:
    python CreateUniqueName()创建唯一的名字
    node 创建静态服务器并自动打开浏览器
    基于jQuery 的插件开发
    Fetch
    纯css 来实现下拉菜单
    javascript模板引擎之
    jquery jsonp 跨域
    数据库增删改查
    Promise
    Vue.js
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11909228.html
Copyright © 2011-2022 走看看