from django.db import models
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.bname
class 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.aname
class 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,Sum
models.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'))