2014-10-27 91 views
0

我试图查询相关的字段到一个Catalog类,其中许多项目与外键相关。目前,我想要:Django QuerysSet查找相关的外键字段

article = forms.ModelChoiceField(queryset=Catalog.objects.select_related(
    'article_products')) 

似乎做同样的查询为:

queryset = Catalog.objects.all() 

谁能帮我引导方向是正确的?这是我正在使用的模型。

class Catalog(models.Model): 
    products = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.products 

class Article(models.Model): 
    catalog = models.ForeignKey(Catalog, related_name='article_products') 
    title = models.CharField(max_length=200) 
    abstract = models.TextField(max_length=1000, blank=True) 
    full_text = models.TextField(blank=True) 
    proquest_link = models.CharField(max_length=200, blank=True, null=True) 
    ebsco_link = models.CharField(max_length=200, blank=True, null=True) 

    def __unicode__(self): 
     return self.title 

我的目标是在所有与目录相关的文章中都有一个表单选择字段。它目前只显示目录的名称。

+0

您是否使用modelforms?你可以发布你的整个表格类吗? – cdvv7788 2014-10-27 03:48:18

回答

1

我不认为select_related方法将完成您已经设定的使用此ModelChoiceField实现的目标。你说的很正确,下面的两个查询返回相同导致查询集:

Catalog.objects.all().select_related('article_products')) 
Catalog.objects.all() 

Django的查询集的select_related方法用于不同的功能,具体的性能加强,以减少存取需要获得数据的数据库的数量你想从模型实例中检索。 The Django reference about this method包含非常好的文档,并举例说明为什么要使用select_related方法来提高性能。

就这样说,您的原始目的仍然是:表单域将显示与给定目录相关的所有文章。

为了实现这个目标,似乎最好过滤文章对象的查询集赋予表单域。首先,如果我们想在ModelChoiceField中显示文章的对象,我们当然应该给予ModelChoiceField含Article对象,而不是目录对象的查询集,像这样:

article = forms.ModelChoiceField(queryset=Article.objects.all()) 

但这个查询集的说法是不完全正确,无论是。我们仍然传递数据库中存在的所有Article对象的查询集。相反,我们只想传递与给定Catalog对象关联的文章。为了实现这一目标,我们可以过滤条查询集以仅获得与某个目录对象的Article对象,像这样:

# cat is some catalog object 
article = forms.ModelChoiceField(queryset=Article.objects.filter(catalog=cat)) 

在这个例子中,查询集过滤器返回只包含一个Article对象引用给定的Catalog对象。该查询集将用于填充ModelChoiceField。

有关按字段查找过滤的更多信息,see the Django documentation here