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()
我不确定上面的代码是否正确。 有没有更好的方法来做到这一点?
答案 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()