2017-02-09 72 views
1

我目前在django的数据库应用程序中工作。我想使用django-filter为页面添加高级过滤功能,但是我发现了一个问题,我希望你能帮助我。Django .filter只显示第一个对象

为了说明我的观点,

Organism.objects.all().filter(lipids=Lipid.objects.all()) 

只返回具有第一脂质对象的生物对象,而不是所有的生物对象的....

更多细节: 比方说,我的型号有: 型号:

class Organism(models.Model): 
    species_name = models.CharField(max_length=200, help_text="Species Name") 
    strain_name = models.CharField(max_length=200, help_text="Strain Name") 
    lipids = models.ManyToManyField('Lipid',blank=True) 

    def __str__(self): 
     return('{}'.format(self.species_name)) 

class Lipid(models.Model): 
    common_name = models.CharField(max_length=100,blank=True) 
    category = models.CharField(max_length=100,blank=True) 
    main_class = models.CharField(max_length=100,blank=True) 

    def __str__(self): 
     return('{}'.format(self.common_name)) 

在Django的壳:

In [1]: from catalog.models import * 
In [2]: o = Organism.objects.all() 
In [3]: l = Lipid.objects.all() 
In [4]: o 
Out[4]: <QuerySet [<Organism: speceies_name_001>, <Organism: speceies_name_002>, <Organism: speceies_name_003>, <Organism: speceies_name_004>]> 
In [5]: l 
Out[5]: <QuerySet [<Lipid: common_name_001>, <Lipid: common_name_002>, <Lipid: common_name_003>, <Lipid: common_name_004>]> 
In [6]: o.filter(lipids=l) 

Out[6]: <QuerySet [<Organism: speceies_name_001>]> 

我期望看到所有的生物[6],因为我没有过滤任何东西!
我相信这是一个基本的东西我失踪,但无法弄清楚!

+0

所以你基本上想要所有的有机体与他们有关联的脂质? – karthikr

+0

是的,其实这是对我的问题的简化,只是为了表明我的观点。在这种情况下,我期待看到所有的有机体,因为我正在过滤所有的脂质......而且它只返回具有第一脂质的有机体......我相信它与脂质成为一体manytomany field .... –

回答

0

通过执行以下Django的第一个自动选择作为关系参数,你想达到什么(聪明的一)

.filter(lipids=Lipid.objects.all()) 

是继

.filter(lipids__in=Lipid.objects.all()) 

,但更好的办法是做以下

.filter(lipids__isnull=False) 
+0

感谢您的快速答案!这解决了我所问的问题,但不幸的是我试图将这个应用于我真正的问题(与Django过滤器结合),并且它一直在做同样的事情。我想我会问一个有关所有细节的新问题。 –

+0

新的问题.... https://stackoverflow.com/questions/42148018/django-filter-only-shows-first-object –