zoukankan      html  css  js  c++  java
  • 多表查询

    创建模型

    class Book(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=5, decimal_places=2)
        publish_date = models.DateField()
        # 阅读数
        reat_num=models.IntegerField(default=0)
        # 评论数
        commit_num=models.IntegerField(default=0)
    
        publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
        authors=models.ManyToManyField(to='Author')
        def __str__(self):
            return self.name
    
    
    class Author(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)
    
    
    class AuthorDatail(models.Model):
        nid = models.AutoField(primary_key=True)
        telephone = models.BigIntegerField()
        birthday = models.DateField()
        addr = models.CharField(max_length=64)
    
    
    class Publish(models.Model):
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        city = models.CharField(max_length=32)
        email = models.EmailField()
        
    
    表关系创建(上面已经写了)
    一个出版社可以出版多本书,一本书只能有一个出版社
    	一对多(一旦确立了一对多的关系,关联字段要放在多的表里)
    	models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
    	
    一个作者可以写多本书,一本书可以有多个作者
    	多对多(需要第三张表)
    	models.ManyToManyField(to='Author')
    	
    一对一
    	author和author_detail是一对一
    	models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)
    

    添加表记录

    一对多
    方式1:
       publish_obj=Publish.objects.get(nid=1)
       book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish=publish_obj)
      
    方式2:
       book_obj=Book.objects.create(title="",publishDate="2012-12-12",price=100,publish_id=1)
    
    多对多
    # 当前生成的书籍对象
    book_obj=Book.objects.create(title="追风筝的人",price=200,publishDate="2012-11-12",publish_id=1)
    
    # 为书籍绑定的做作者对象
    yuan=Author.objects.filter(name="yuan").first() # 在Author表中主键为2的纪录
    egon=Author.objects.filter(name="alex").first() # 在Author表中主键为1的纪录
    
    # 绑定多对多关系,即向关系表book_authors中添加纪录
    book_obj.authors.add(yuan,egon)   # 也可以传入pk值或者*(yuan,egon)
    

    基于对象的多表查询(子查询)

    A表book(关联自动段)   B表 publish
        # 正向查询   A--->B    
        # 反向查询   B-->A 
    总结:一对一  正向:按字段  反向:按表名小写
          一对多  正向:按字段  反向:按表名小写_set
          多对多  正向:按字段  反向:按表名小写_set 
    

    基于下划线的多表查询(连表查询)

    总结:用__告诉orm,要连接那个表
        一对一: 正向:按字段  反向:按表名小写 
        一对多:  正向:按字段  反向:按表名小写 
        多对多:  正向:按字段  反向:按表名小写 
    

    聚合查询

    from django.db.models import Avg,Count,Max,Min,Sum
    Book.objects.all().aggregate(c=Avg('price'))
    

    F和Q

    from django.db.models import F,Q
    F:
        F() 的实例可以在查询中引用字段:
            Book.objects.filter(commit_num__gt=F('reat_num')).values('name')
        把所有书的价格加1:
            Book.objects.all().update(price=F('price')+1)
    
    Q:
        | & 和  ~ Book.objects.all().filter(Q(name='在人间')|Q(price='13'))
        Book.objects.all().filter(~Q(name='在人间')& Q(price='13'))
  • 相关阅读:
    二叉树逻辑结构重点
    循环链表
    数据结构 单链表
    《深入理解计算机系统》第7章:重定位PC相对引用的理解
    一个关于空指针的思考
    简单解决python安装中的Unable to find vcvarsall.bat问题
    解决python本地离线安装requests问题
    使用共享内存和信号量模拟实现多进程会话
    使用openssl演练数字签名
    简单了解C语言内嵌汇编
  • 原文地址:https://www.cnblogs.com/luck-L/p/9629684.html
Copyright © 2011-2022 走看看