2013-06-13 35 views
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() 

查询我不知道,如果上面的代码是正确的。 有没有更好的方法来做到这一点?

回答

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