Python3之Django Web框架的双下划线跨表查询,聚合查询,分组查询

来源:互联网 发布:山姆.维特维奇 知乎 编辑:程序博客网 时间:2024/06/06 20:39
from django.db import models# Create your models here.class Book(models.Model):    bid = models.AutoField(primary_key=True)    bname = models.CharField(max_length=32)    bpub_date = models.DateField(auto_now_add=True)    bprice = models.DecimalField(max_digits=5, decimal_places=2)    author = models.ManyToManyField('Author')    publisher = models.ForeignKey('Publisher')    def __str__(self):        return self.bnameclass Author(models.Model):    aid = models.AutoField(primary_key=True)    aname = models.CharField(max_length=32)    aqq = models.IntegerField()    publisher = models.ForeignKey('Publisher')    def __str__(self):        return self.anameclass AuthorDetail(models.Model):    adid = models.AutoField(primary_key=True)    aage = models.IntegerField()    atel = models.IntegerField()    author = models.OneToOneField('Author')class Publisher(models.Model):    pid = models.AutoField(primary_key=True)    pname = models.CharField(max_length=100)    ptel = models.IntegerField()    paddr = models.CharField(max_length=1000)

双下划线跨表查询:

正向查询:    根据本对象所在字段可以查出对应的对象及对象的属性;    models.Book.objects.filter(author__aname='egon').values('publisher__pname ')反向查询:    和正向是一样的,只是查找的时候直接用类名,不需要加_set即可;

聚合查询:

from django.db.models import Avg,Count,Max,Min,Summodels.Book.objects.aggregate(Avg('price'))

分组查询(annotate的意思是注解,可以产生一个新的字段给对象用):

from django.db.models import Avg,Count,Max,Min,Sum#按照每一本书分组:models.Book.objects.annotate(book_count=Count('bid'))#按照特定的字段分组:models.Book.objects.values('publish__pid').annotate(book_count=Count('bid'))
原创粉丝点击