0
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()

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

4

1 回答 1

1

您可以使用 Django Q对象执行此操作:

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()
于 2013-06-13T09:05:47.900 回答