在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))
答案 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")