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

django filter queryset based on __str__ of model

我有以下型号:

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____unicode__ 方法。我做了这个过滤器查询:

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

这几乎就是我想要的,只是不完全是。我真正想要的是一个过滤器,它检查对象的 __str__ 表示是否包含一些字符组,而不是仅仅检查 subspecies 字段。而不是 subspecies__contains=... 它会像 __str____contains=... 但当然那是行不通的。

这可能吗?如果可以,我将如何进行此查询?

谢谢!

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

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

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

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