通过作者去查询书的操作:作为反向查询
可以先查询作者的记录,然后通过多对多的第三张表操作去反向查询,在表间约束属性下进行调用
1 class Author(models.Model):
2 aid=models.AutoField(primary_key=True)
3 aname=models.CharField(max_length=64,null=False,unique=True)
4 book=models.ManyToManyField(to='Book')
表间约束构成book_author表
可以通过create和add方法来添加数据
1 book_obj=models.Book.objects.filter(bid__gt=4)
2 models.Author.objects.filter(aid=5)[0].book.add(*book_obj)
3 print(book_obj)
需要注意的是:用到filter时,必须牢记其返回的结果为一个对象列表集。因此想对里面的对象进一步操作时,
必须先取对象出来,再进行数据处理
聚合函数:
1 from django.db.models import Max,Min,Count,Avg,Sum
2
3 # obj=models.Book.objects.all().annotate(aid=Count('author'))
分组:
1 auto_obj=models.Author.objects.all().annotate(price_sum=Sum('book__price')).values_list('aname','price_sum')
2 print(auto_obj)
3 obj=models.Author.objects.all().annotate(book_cot=Count('book'),price_sum=Sum('book__price'))
4 for a in obj:
5 print(a.book_cot,a.aname,a.price_sum)
希望Django终端输出SQL语句:
可以在setting配置文件最后里面加入logging代码块:
1 LOGGING = {
2 'version': 1,
3 'disable_existing_loggers': False,
4 'handlers': {
5 'console':{
6 'level':'DEBUG',
7 'class':'logging.StreamHandler',
8 },
9 },
10 'loggers': {
11 'django.db.backends': {
12 'handlers': ['console'],
13 'propagate': True,
14 'level':'DEBUG',
15 },
16 }
17 }
F查询比较字段列与Q查询(相当于条件or 字段属性必须放在Q后面)
1 from django.db.models import F,Q
2 # show= models.Book.objects.all().filter(kucun__gt=F('sale'))
3 # print(show)
4
5 # models.Book.objects.update(kucun=(F('kucun')+1)*3)
6 # from django.db.models.functions import Concat
7 # from django.db.models import Value
8 # models.Book.objects.update(bname=Concat(F('bname'),Value('第四版')))
9 p=models.Book.objects.filter(Q(author__aname='蒋梦玲')|Q(author__aname='李菲菲'))
10 print(p)
事务:保证数据的原子性操作,try里面的语句块必须全部正确执行才通过,否则执行exception
1 try:
2 from django.db import transaction
3 with transaction.atomic():
4 new_press=models.Press.objects.create(name='火星出版社')
5 models.Book.objects.create(bname='橘子物语',press_id=9,price=9.8)
6 except Exception as e:
7 print(str(e))