django如何命令查询集,以便首先列出特定实例?

时间:2013-08-16 09:47:12

标签: django django-queryset

我需要以这样的方式订购我的查询集:

>>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]

任何人都可以为此提供一个不妨碍性能的好解决方案吗?

2 个答案:

答案 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