【问题标题】:How to optimize a query on a model with foreign keys AND many to many field如何使用外键和多对多字段优化模型查询
【发布时间】:2022-11-13 22:33:09
【问题描述】:

(https://pastebin.com/qCMypxwz) 这些是我的模型。

现在进行了 14 次查询以获得所需的结果。大多数情况下,会进行查询以获取与每个产品相关联的图像。图像是多对多字段,因为每个产品都有很多图像。

productList = Variants.objects.select_related('prod_id__category')

            for productName in productList:
                products = dict()
               
                prod_id = productName.id 
                products['id'] = prod_id

                products['category'] = productName.prod_id.category.category_name
                products['prod_name'] = productName.prod_id.prod_name
               
        
                prod_images = list(productName.image.values_list('image_url').distinct())
                image_list = list()
                
                for image in prod_images:     
                    image_list.append(image[0])
                products['image'] = image_list
                price =  productName.price
                products['price'] = price
                createdAt =  productName.createdAt
                products['createdAt'] = createdAt
                productListDict.append(products)

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    您可以使用.prefetch_related(..) [Django-doc] 在一个额外的查询中获取所有Images:

    variants = Variants.objects.select_related(
        'prod_id__category'
    ).prefetch_related('image')

    因此,您可以使用my_variant.image.all() 访问这些,但由于该查询集已经预取,因此它不会再次加载Images。


    笔记:通常不会将后缀 …_id 添加到 ForeignKey 字段,因为 Django 将自动添加一个带有…_id 后缀的“孪生”字段。因此应该 是product,而不是prod_id.


    笔记:通常 Django 模型中的字段名称是写在蛇案例, 不是帕斯卡案例,所以应该是:created_at 而不是createdAt.


    笔记: 通常一个 Django 模型被赋予一个单数名称,所以 Variant 而不是Variants.

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2016-10-24
      • 2017-03-09
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多