django reverse外键pefetch相关,queryset条件不起作用

dgsult0t  于 2023-02-14  发布在  Go
关注(0)|答案(1)|浏览(81)

考虑以下情况:

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")
x0fgdtte

x0fgdtte1#

如果您只需要问题中所述的值,那么您可以直接使用fk关系从Store模型到Book模型,如下所示。无需反向查找。

Store.objects.filter(default=True).values('name', 'default', 'books__name')

但是如果你想获取所有的Book以及它们对应的Store,那么你可以在prefetch_related上使用only.values不像文档中所述的那样与prefetch_related一起工作。你也可以在prefetch_related查询中分配to_attr后使用for循环。for循环不执行数据库查询。而是从prefetch艾德结果中获取值。

books_stores = Book.objects.prefetch_related(Prefetch('store_set',
            queryset=Store.objects.filter(default=False), 
            to_attr='stores'))

for book_store in book_stores:
    stores = book_store.stores

相关问题