zoukankan      html  css  js  c++  java
  • Django——多表操作之模型创建,一对多添加记录,多对多添加修改删除记录,多对多其他api

    一、多表操作之模型创建

    1 图书表:book,作者表:author,作者详情表:authordetail,出版社表:publish,(第三张中间表)
    2 作者跟作者详情:是一对一,关联字段写在哪一方都可以
    3 图书跟出版社:是一对多,一对多关系一旦确立,关联字段写在多的一方
    4 图书和作者:是多对多,多对多的关系需要建立第三张表(可以自动生成)
    
    5 models.py中把关系建立出来
    from django.db import models
    ### django:  1.11.1     2.0.7
    # Create your models here.
    class Publish(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=64)
        phone = models.CharField(max_length=64)
        email = models.EmailField()
    
    
    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=6, decimal_places=2)
        publish_date = models.DateTimeField(auto_now_add=True)
    
        # to='Publish'跟Publish表做关联(ForeignKey,一对多)
        # to_field='id'跟哪个字段做关联
        # publish=models.CharField(max_length=32)
        # publish=models.ForeignKey(to='Publish',to_field='id')
        # publish = models.ForeignKey(to='Publish')  # 不写,默认跟主键做关联
        publish = models.ForeignKey(to=Publish)  # 不写,默认跟主键做关联
    
        # 自动创建出第三张表(这句话会自动创建第三章表)
        # authors在数据库中不存在该字段,没有to_field
        # 默认情况:第三张表有id字段,当前Book表的id和Author表的id字段
        authors=models.ManyToManyField(to='Author')
    
    
    class Author(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        age = models.SmallIntegerField()
        # 一对一的本质是  ForeignKey+unique
        author_detail=models.OneToOneField(to='AuthorDetail',to_field='id')
        # author_detail=models.ForeignKey(to='AuthorDetail',to_field='id',unique=True)
    
    
    class AuthorDetail(models.Model):
        id = models.AutoField(primary_key=True)
        sex = models.SmallIntegerField()
        addr = models.CharField(max_length=64)
        phone = models.BigIntegerField()
        
     
    6 同步到mysql数据库
        -配置文件
        -pymysql.install_as_mysqldb()
            -公司可以用过的mysqlclient
        -两条命令
        
    7 2.x版本的django
        -外键字段必须加  参数:on_delete
        -1.x版本不需要,默认就是级联删除
        -假设,
            删除出版社,该出版社出版的所有图书也都删除,on_delete=models.CASCADE
            删除出版社,该出版社出版的图书不删除,设置为空on_delete=models.SET_NULL,null=True
            删除出版社,该出版社出版的图书不删除,设置为默认on_delete=models.SET_DEFAULT,default=0

    二、一对多添加记录

    publish=models.Publish.objects.create(name='北京出版社',addr='北京',phone='0536-12345678',email='邮箱地址')
        # 新增金梅图书
    book=models.Book.objects.create(name='金梅',price='23.45',publish=publish)# publish=对象
        # book=models.Book.objects.create(name='西游记',price='23.55',publish_id=1)# publish_id=数字
        # 新增西游记
    book=models.Book.objects.create(name='西游记',price='23.55',publish_id=publish.id)# publish_id=数字
    
    
    # 总结:
        1 email可以不传email,本质就是varchar(admin中会判断)
        2 新增图书:
            -publish=publish
            -publish_id=publish.id
        3 写在表模型中的publish字段,到数据库中会变成publish_id(ForeignKey)
        4 查到book对象以后
            -book.publish     对象
            -book.publish_id  id号,数字

    三、多对多添加记录,修改,删除

    1 自动创建的表,表模型就拿不到,book.authors代指表模型
    
    
        # 多对多,作者和书
        # 给西游记这本书新增两个作者lqz和egon
        # 去到西游记这本书
        # book=models.Book.objects.get(name='西游记')
        # 代指中间表book.authors
        # lqz=models.Author.objects.get(id=2)
        # egon=models.Author.objects.get(id=3)
        # book.authors.add(2,3) # 新增作者,通过id新增
        # # book.authors.add(lqz,egon) # 新增作者,通过对象新增
        # book.authors.add(2,egon) # 新增作者,通过对象新增
    
        # 西游记删除一个作者
        # book = models.Book.objects.get(name='西游记')
        # book.authors.remove(2)
        # egon = models.Author.objects.get(id=3)
        # book.authors.remove(egon)
    
        # clear 清空所有作者
        book = models.Book.objects.get(name='西游记')
        # book.authors.add(2, 3)
        # book.authors.clear()
    
        # set 先清空,再add,前提是不存在的作者
        book.authors.set([4, ])
        
        # add ,remove,set clear

    四、多对多其他api

    # 详见  add ,remove,set clear
  • 相关阅读:
    jQuery Validate验证框架详解
    struts异常:No result defined for action
    spring问题:java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive
    Mybatis异常:java.lang.ClassNotFoundException: org.mybatis.spring.SqlSessionFactoryBean
    HttpServletRequest cannot be resolved to a type。
    struts文件异常Included file cannot be found
    JS中获取session中传过来的值对象
    [JS]Math.random()
    用photoshop将图片四角变成圆角
    SSH的jar包下载地址
  • 原文地址:https://www.cnblogs.com/guojieying/p/13813949.html
Copyright © 2011-2022 走看看