基于模型的__str__的django过滤器查询集

时间:2016-07-19 14:02:13

标签: python django filter django-queryset

我有以下型号:

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

请注意,在species__str__方法中使用了ForeignKey字段__unicode__。我做了这个过滤查询:

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

这几乎是我想要的,除了不完全。我真正想要的是一个过滤器,它检查对象的__str__表示是否包含某些字符组,而不仅仅是检查subspecies字段。它不是subspecies__contains=...,而是__str____contains=...,但当然不起作用。

这可能吗?如果是这样我将如何进行此查询?

谢谢!

2 个答案:

答案 0 :(得分:4)

过滤器生成要在DB中执行的查询。

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

答案 1 :(得分:0)

我在这里找到的最佳方法是用引号('')标记目标。然后将字符串切成薄片并根据它进行过滤..这是您情况下的处理方法

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+" "+" 'str(self.subspecies)'"

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

您所看到的subspecies部分现在位于''

之间

然后执行下一步以基于它进行过滤:

sub_input = request.GET.get('term')
sub = sub_input .split("'")[1::2] #not sure how did [1::2] works but it is the only way that worked for me 
l = Subspecies.objects.filter(subspecie=sub[0]) #used indexing as split gives you result as a list