values(),values_list() 都是得到当前对象的所有字段或者指定字段的值。
官方文档说明:
https://docs.djangoproject.com/en/2.1/ref/models/querysets/#values-list
values()
# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles')
<QuerySet [<Blog: Beatles Blog>]>
# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
>>> Blog.objects.values()
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
>>> Blog.objects.values('id', 'name')
<QuerySet [{'id': 1, 'name': 'Beatles Blog'}]>
values_list()
>>> Entry.objects.values_list('id').order_by('id')
<QuerySet[(1,), (2,), (3,), ...]>
>>> Entry.objects.values_list('id', flat=True).order_by('id')
<QuerySet [1, 2, 3, ...]>
举例:推荐根据tag相似的文章
from django.db.models import Count
article_tags_ids = article.article_tag.values_list('id',flat=True)
similar_articles = ArticlePost.objects.filter(article_tag__in=article_tags_ids).exclude(id=article.id) # 将当前文章清除
similar_articles = similar_articles.annotate(same_tags=Count('article_tag')).order_by('-same_tags','-created')[:4] # ①
# ArticlePost 与 ArticleTag 多对多关系
# values_list(),返回值的类型是列表,如果不声明flat=True,列表是由元组组成
# values()返回值的类型是字典
# ① 句,对所有相似文章,根据当前文章相同的标签数量进行标注,然后以相同标签数量和文章发布时间为关键词排序,倒序
网友评论