• 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
        )
    
  • 相关阅读:
    前端页面模拟浏览器搜索功能Ctrl+F实现
    正则表达式中?=和?:和?!的理解
    JRebel激活教程
    BAT脚本一键启动多个程序
    WinInet简介及操作流程
    通过线程传递消息
    两串口收发测试
    获取PC可用串口端口,并将其在combo box中显示
    为MFC应用程序添加登录对话框界面
    Using CInternetFile open an Url
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11909228.html
Copyright © 2020-2023  润新知