2016-07-19 128 views
2

的我有以下模式:django的过滤器查询集基于__str__模型

class Subspecies(models.Model): 
    species = models.ForeignKey(Species) 
    subspecies = models.CharField(max_length=100) 

    def __str__(self): 
     return self.species.species_english+" "+self.species.species+" "+self.subspecies 

    def __unicode__(self): 
     return self.species.species_english+" "+self.species.species+" "+self.subspecies 

注意,ForeignKey的字段,species__str____unicode__方法中。我做了这个过滤器查询:

l = list(Subspecies.objects.filter(subspecies__contains=request.GET.get('term')).order_by('subspecies')[:10]) 

这就是我想要什么差不多,但不完全是。我真正想要的是一个筛选器,用于检查对象的__str__表示是否包含某组字符,而不是仅检查subspecies字段。而不是subspecies__contains=...它会像__str____contains=...,但当然不起作用。

这可能吗?如果我如何做这个查询?

谢谢!

+1

为什么不能在相关模型的三个字段上过滤? – e4c5

+0

是的,这是我最终做的,我宁愿能够一起搜索整个短语,但单独用OR进行筛选几乎可以。 –

回答

3

过滤器生成一个要在数据库中执行的查询。

__str__在Python解释器中运行。你不能从数据库中调用它。 所以简短的回答是“不,你不能”。例如,您必须手动过滤它,例如使用内置函数filter

+0

谢谢你。我以前很怕那个。该模型包含20K行。我在壳中尝试了这一点,但花了相当长的时间。 '[我为我在subspecies.objects.all()如果'aur'unicode(i)]''数据库过滤方法非常快。网络可能会太慢。 –

+0

类似的性能很差:'a = filter(lambda x:'aur'in unicode(x),s.objects.all())': -/ –

+0

您可以使用原始SQL表达式来进行这样的查询, '...在哪里species_english ||物种||亚种CONTAINS ...' –