我可以在Django ORM中使用Q对象查找相关字段吗?

时间:2017-06-12 10:19:04

标签: python django orm

在Django中,我可以在多个模型上重复使用现有的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))

2 个答案:

答案 0 :(得分: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 }

答案 1 :(得分:2)

你可以这样做

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