考虑以下情况:
class Book(models.Model):
name = models.CharField(max_length=300)
price = models.IntegerField(default=0)
def __str__(self):
return self.name
class Store(models.Model):
name = models.CharField(max_length=300)
default = models.BooleanField(default=False)
books = models.ForeignKey(Book, on_delete=models.CASCADE)
因此,对于此查询:
Book.objects.prefetch_related(Prefetch('store_set',
queryset=Store.objects.filter(default=False)))
.values("store__name", "name", "store__default")
SQL查询不考虑查询集default = True条件
SELECT "core_store"."name",
"core_book"."name",
"core_store"."default"
FROM "core_book"
LEFT OUTER JOIN "core_store"
ON ("core_book"."id" = "core_store"."books_id")
结果:
<QuerySet [{'store__name': 'Subway Store', 'name': 'Hello', 'store__default': False},
{'store__name': 'Times Square', 'name': 'Hello', 'store__default': False},
{'store__name': 'Subway Store', 'name': 'GoodBye', 'store__default': True},
{'store__name': 'Times Square', 'name': 'GoodBye', 'store__default': False},
{'store__name': 'Subway Store', 'name': 'Greetings', 'store__default': True},
{'store__name': 'Subway Store', 'name': 'HateWords', 'store__default': False}]>
我想在预取查询时设置查询条件。我找不到任何方法在一个查询或最少数量的查询中完成此操作。
我认为它应该使用带有core_store表的OUTER JOIN来创建where条件。
LEFT OUTER JOIN "core_store"
ON ("core_book"."id" = "core_store"."books_id")
1条答案
按热度按时间x0fgdtte1#
如果您只需要问题中所述的值,那么您可以直接使用
fk
关系从Store
模型到Book
模型,如下所示。无需反向查找。但是如果你想获取所有的
Book
以及它们对应的Store
,那么你可以在prefetch_related
上使用only
。.values
不像文档中所述的那样与prefetch_related
一起工作。你也可以在prefetch_related
查询中分配to_attr
后使用for
循环。for循环不执行数据库查询。而是从prefetch
艾德结果中获取值。