0

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

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

谁能为此提供一个不妨碍性能的好解决方案?

4

2 回答 2

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' )
于 2013-08-16T10:05:39.427 回答
-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
于 2013-08-16T09:49:49.530 回答