Django零散知识点

随机排序

想对查询的结果进行随机排序需要使用?

1
2
#随机获取前10条记录
qs = Blog.objects.order_by('?')[:10]
不等于过滤

当我们想要使用不等于排除数据的时候,有两种方案

方案一:使用exclude

1
Blog.objects.filter(author=user).exclude(id=1)

方案二:使用Q

1
2
3
from django.db.models import Q

Blog.objects.filter(~Q(id=1))
对于ForeignKey对象,clear()和remove()方法仅在null=True时存在。

举个例子:

ForeignKey字段没设置null=True时,

1
2
3
class Book(models.Model):
title = models.CharField(max_length=32)
publisher = models.ForeignKey(to=Publisher)

没有clear()和remove()方法:

1
2
3
4
>>> models.Publisher.objects.first().book_set.clear()
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'RelatedManager' object has no attribute 'clear'

当ForeignKey字段设置null=True时,

1
2
3
class Book(models.Model):
name = models.CharField(max_length=32)
publisher = models.ForeignKey(to=Class, null=True)

此时就有clear()和remove()方法:

1
>>> models.Publisher.objects.first().book_set.clear()

注意:对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。

可以使用Concat修改字符串属性

例子:把所有书名后面加上(第一版)

1
2
3
>>> from django.db.models.functions import Concat
>>> from django.db.models import Value
>>> models.Book.objects.all().update(title=Concat(F("title"), Value("("), Value("第一版"), Value(")")))
知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!