我需要以这样的方式订购我的查询集:
>>tag_queryset
[tag4, tag3, tag1, tag2]
默认查询集是:
>>Tag.objects.all()
[tag1, tag2, tag3, tag4]
所以我有一个特定的查询集,如:
>>tags_to_place_first
[tag4, tag3]
我想将它与Tag模型中all()对象的公共查询集合并,以便在结果序列中首先放置tag4和tag3:
#something like this
>>Tag.objects.all().placeFirst(tags_to_place_first)
[tag4, tag3, tag1, tag2]
任何人都可以为此提供一个不妨碍性能的好解决方案吗?
答案 0 :(得分:1)
您正在谈论性能解决方案,然后,方法就是这样。对于您的代码模型附加名为“sort_field”的新属性:
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=30)
sort_field = models.IntegerField()
为方便起见填充模型:
Tab.objects.filter( name = 'tag4' ).update( sort_field = 1 )
Tab.objects.filter( name = 'tag3' ).update( sort_field = 2 )
最后按新sort_field排序:
Tag.objects.all().order_by( 'sort_field' )
答案 1 :(得分:-1)
您可以合并查询集,例如:
merged_tags_qs = tags_to_place_first | other_tags
对列表或单个实例有效:
merged_tags_qs = [tag4, tag3] | other_tags
merged_tags_qs = tag4 | other_tags
这是django的神奇功能之一:D
如果要从查询集中删除tags_to_place_first
中的代码:
other_tags = Tag.objects.exclude(pk__in=[tag.pk for tag in tags_to_place_first])
merged_tags_qs = tags_to_place_first | other_tags