通过作者去查询书的操作:作为反向查询
可以先查询作者的记录,然后通过多对多的第三张表操作去反向查询,在表间约束属性下进行调用
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))