我有以下型号:
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=...
,但当然不起作用。
这可能吗?如果是这样我将如何进行此查询?
谢谢!
答案 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