2009-12-30 107 views
51

我试图根据外键的特定字段的值过滤Django中的表。Django - 过滤外键属性

比如我有两个型号 -

# models.py 
class Asset(models.Model): 
name = models.TextField(max_length=150) 
project = models.ForeignKey('Project') 

class Project(models.Model): 
name = models.TextField(max_length=150) 

我想基于相关项目的名称进行筛选,我的资产清单。

目前我执行两个查询:

# views.py 
project_list = Project.objects.filter(name__contains="Foo")   
asset_list = Asset.objects.filter(desc__contains=filter, project__in=project_list).order_by('desc') 

我不知道是否有在主查询指定这种过滤的方法吗?

回答

71

Asset.objects.filter(project__name__contains="Foo")

+1

谢谢, 我曾试过,但显然我忘记了使用双下划线。 – 2009-12-30 18:13:31

+0

是否包含必要? – DeadDjangoDjoker 2015-07-11 07:08:46

9

queryset-refactor分支在1.0之前登陆以来,这已成为可能。 Ticket 4088暴露了这个问题。这应该工作:

Asset.objects.filter(
    desc__contains=filter, 
    project__name__contains="Foo").order_by("desc") 

Django Many-to-one documentation有这个和其他使用模型API的外键的例子。

+0

难道这会打的DB两次,我应该使用select_related(),使这个更优? – 2009-12-30 22:52:06

+4

您可以添加.query.as_sql()来查看将实际执行的sql。 – fastmultiplication 2010-07-17 05:19:32

+0

链接到Django文档是完全过时的,并在'410页删除'土地: -/ – szeitlin 2015-10-09 17:14:51