两个查询集的排序列表

时间:2013-06-13 08:46:21

标签: django union django-queryset

class TagSynonym(models.Model):
    source_tag_name = models.CharField(max_length=255, unique=True)
    target_tag = models.ForeignKey(Tag, related_name='tag_synonyms', null=True)

class Tag(models.Model):
    name = models.CharField(max_length=255, unique=True)
    used_count = models.PositiveIntegerField(default=0)
    class Meta:
        ordering = ('-used_count', 'name')

对于给定的查询q
我希望所有包含查询的标签都在其名称或相关同义词的source_tag_name中 我还希望ordering保留排序顺序。

我有类似以下的查询

    tags_by_name = tag_all.filter(name__contains=q)
    tags_by_synonyms = tag_all.select_prefetched('tag_synonyms').filter(tag_synonyms__source_tag_name__contains=q).distinct()
    tags = tags_by_name | tags_by_synonyms
    tags = tags.distinct()

我不确定上面的代码是否正确。 有没有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用Django Q object:

执行此操作
from django.db.models import Q

qs = Tag.objects.select_prefetched('tag_synonyms').filter(
    Q(name__contains=q) | Q(tag_synonyms__source_tag_name__contains=q)) \
    .distinct()