2017-06-12 49 views
1

在Django中,我可以在多个模型上重新使用现有的Q对象,而无需使用两次相同的过滤器?我可以使用Django ORM中的Q对象查找相关字段吗?

我在想沿下方的伪Django的代码行的东西,但没有找到文档中任何相关信息:

class Author(Model): 
    name = TextField() 
    company_name = TextField() 

class Book(Model): 
    author = ForeignKey(Author) 

# Create a Q object for the Author model 
q_author = Q(company_name="Books & co.") 

# Use it to retrieve Book objects 
qs = Book.objects.filter(author__matches=q_author) 

如果这是不可能的,我可以扩展现有的Q对象在相关领域工作?伪例如:

# q_book == Q(author__company_name="Books & co.") 
q_book = q_author.extend("author") 

# Use it to retrieve Book objects 
qs = Book.objects.filter(q_book) 

我发现接近使用子查询,这是一个有点笨拙的唯一的事:

qs = Book.objects.filter(author__in=Author.objects.filter(q_author)) 
+0

喜欢它只是需要'author__company_name =“书籍和Co”我不明白你的'Q'对象在这里,你的第一个查询看起来使用' – Sayse

+0

对不起,我想我应该有使它更清晰。我真正的Q对象非常大(远远超过我的例子),我真的很想在相关模型上重用它,而不必重新定义它两次。 –

回答

3

从我的评论中可以看出,它看起来像是在尝试将一组通用参数传递给多个过滤器,为此您只需打开一个字典即可打包

在字典中的值仍然可以为Q对象如果需要的话,如果它是你会传递到过滤器参数的值通常

args = { 'author__company_name': "Books & co" } 
qs = Book.objects.filter(**args) 

args['author_name'] = 'Foo' 
qs = Book.objects.filter(**args) 

不同车型之间共享这一点,你必须做一些字典重整

author_args = { k.lstrip('author__'): v for k, v in args.items } 
+0

谢谢!我在一些地方实际上使用了这种模式。我的目标是能够将同一组过滤器传递给多个_models_。很明显,''Book.objects.filter(** args)'和'Author.objects.filter(** args)'具有相同的'args'不能直接使用,但这正是我想要实现的。 –

+0

@ F.X。 - 对啊,我现在看到,我认为没有比以相同/类似方式使用解压缩更好的方式,无论您遇到同样的问题,以确保两个模型中都存在字段 – Sayse

+0

字段实际上来自在这两种情况下都是Author模型,但我想通过使用完全相同的一组过滤器来过滤相关的'author'字段中的'Books'。我想没有办法做到这一点,然后... –

2

你可以做到这一点

books = Book.objects.filter(author__company_name="Books & co") 
+0

这当然有效,但我编辑了我的问题,以清楚说明我想避免重新定义过滤器,如答案。抱歉! –

相关问题