• (18)模型层 -ORM之msql 多表操作(字段的属性)


    数据库表的对应关系

    1、一对一   #关联字段写在那张表都可以

     PS:只要写OneToOneField就会自动加一个id

    2、一对多  #关系确立,关联字段写在多的一方

    3、多对多   #多对多的关系需要创建第三张表

    PS:创建多对多的时候,ORM会自动创建第三张表,这张就是中间表

    PS:自动 创建的第三章表命名规则就是app_表名_表名

    创建表的对应关系

    '''图书管理系统的数据库'''

    class Author(models.Model):
    '''作家的姓名和年龄'''
    # 表的主键可以不写,默认自动生成id
    '''id = models.AutoField(primary_key=True) #这个可以不写,省略这句代码'''
    name = models.CharField(max_length=32) #姓名
    # IntegerField数字类型,无法显示小数点
    age = models.IntegerField() #年龄

    '''这里表示Author表和AuthorDetail表示一对一的关系,并且关联的字段是id字段,语句里面to表示对应的表,to_field对应的是哪个字段'''
    author_detail = models.OneToOneField(to='AuthorDetail',to_field='id')

    class AuthorDetail(models.Model):
    '''作家的地址和电话'''
    addr = models.CharField(max_length=128) #地址
    phone = models.CharField(max_length=11) #电话


    class Book(models.Model):
    '''书的信息'''
    name = models.CharField(max_length=32) #书名
    # 价格类型的尽量用DexcimalFiled类型,这个是可以表示小数点后的数字,decimal_places表示小数点后几位数
    price = models.DecimalField(max_digits=5,decimal_places=2) # 书的价格

    # 这个是时间日期类型,DatetimeField表示年月日 时分秒,DateField就是年月日
    publish_date = models.DateField() # 出版日期

    # 一对多的关系外键创立,如果不指定关联的键to_field,默认关联主键
    publish = models.ForeignKey(to='Publish')

    # 多对多的关系,写这一句ORM会自动创建第三张表
    authors = models.ManyToManyField(to='Author')

    class Publish(models.Model):
    '''出版社信息'''
    name = models.CharField(max_length=32)
    # EmailField 类型对应的就是varchar类型,并没有限制
    email = models.EmailField()
    phone = models.IntegerField()
    addr = models.CharField(max_length=32)

    多表的新增

    一对一的新增 有两种方式
    # 第一种方式
    '''增加数据一定要注意表的先后顺序,如果字段设置看null=True,即可以为空,就不用注意先后的顺序'''
    author_detail = models.AuthorDetail.objects.create(addr = '南京',phone='1234567890')
    # author_detail_id 就是表的一个字段 author_detail.id 就是author_detail表的主键字段
    author_ = models.AuthorDetail.objects.create(name='lqz2',age=19,author_detail_id=author_detail.id) #最后的author_detail.id也可以协程author_detail.pk,一样的

    #第二种方式
    # author_detail = 对象
    author_detail = models.AuthorDetail.objects.create(addr='东京',phone='1234567890')
    # 最后面关联的字段是一个对象,底层就是去对象中把主键取得,然后对应给author_detail
    author = models.Author.objects.create(name='lqz2',age=19,author_detail=author_detail)


    # 多表的修改,就是在操作第三张表

    # 对应关系的修改
    '''将Author的关联字段中主键是1的修改成author_deatil表中的主键为3的值'''
    author = models.Author.objects.filter(pk=1).update(author_detail_id=3)

    # 用对象修改,对象已经获取了对象的主键,然后将对象直接给author_detai表进行修改
    author_detail = models.AuthorDetail.objects.get(pk=3)
    author = models.Author.objects.filter(pk=1).update(author_detai=author_detail)


    '''一对多关系的新增两种方式'''
    publish = models.Publish.objects.create(name='南京出版社',email='ddddd',phone='1234567890',addr='南京')
    # 这里后面publish=publish,获取对象的主键放入变量,然后增加到对应表的关联列
    book = models.Book.objects.create(name='红楼梦',price=12.34,publish_date='2018-07-08',publish=publish)
    # 这种写法就是直接定义Book表的 publish_id关联 publish表的主键
    book = models.Book.objects.create(name='红楼梦', price=12.34, publish_date='2018-07-08', publish_id=publish.pk)

    '''多对多的关系的修改'''
    # 增加
    '''要添加肯定要先查询,所里这里先查询'''
    book = models.Book.objects.filter(name='红楼梦').first() #这里需求是给红楼梦的书增加两个作者
    # 这样写相当于拿到第三张表,然后将book对象中的红楼梦的id对应上关联表author表中的键值,键值就是add括号里指定的放入第三张表
    book.authors.add(1,4) #add内可以传对象,可以传id

    # 通过对象增加
    lqz = models.Author.objects.get(pk=1)
    egon = models.Author.objects.get(pk=4)
    book.authors.add(lqz,egon)

    # 删除红楼梦这本书的两个作者
    book.authors.clear() #clear 把所有作者删除
    book.authors.remove() #传几个参数移除几个,remove里面可以传id也可以穿对象


    # 修改

    # 修改红楼梦的作者
    # 第一种方式:全部删除clear,然后再add进去
    # 第二种方式:用set修改,底层原理就是把7拿出来后删除全部的,然后再把关联的id=7的放进去
    book.authors.set([7,]) #这里可以传id也可以传对象
  • 相关阅读:
    eslint自动格式化
    焕肤功能
    Web Components
    Webpack 中的 sideEffects
    andriod 新建Activity_ Form
    那么唯美
    C# PDF添加水印
    停止触发器
    sp_sys_ERPTrigger_base
    sql语句返回主键SCOPE_IDENTITY()
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10522471.html
Copyright © 2020-2023  润新知