【问题标题】:Django (REST Framework) - How to add fields to queryset iterationDjango (REST Framework) - 如何向查询集迭代添加字段
【发布时间】:2022-01-03 21:27:08
【问题描述】:

我需要一些关于在 Django (DRF) 中进行查询的建议。

我正在尝试为产品创建一个查询集,其中每个产品都有一个字段“图像”,其中包含该产品的所有图像(文件)(使用 ProductImage 模型耦合),但我不知道如何添加领域。

下面是我的 ProductViewSet

class ProductViewSet(viewsets.ModelViewSet):
    serializer_class = ProductSerializer
    queryset = Product.objects.all()

    def get_queryset(self): 
        queryset = Product.objects.all()
        product_list = []

        # iterate over all products
        for product in queryset:

            # find Image ids for product
            image_ids = list(ProductImage.objects.filter(product=product.id).values_list('image', flat=True))
            images = []

            # iterate over images and add to images list
            for image_id in image_ids:
                image = list(File.objects.filter(id=image_id).all())
                images.append(image)

            # add images field to product
            # product['images'] = images # "TypeError: 'Product' object does not support item assignment"
            product.images = images # Doesn't do anything.

            # add product to product list
            product_list.append(product)

        return product_list

我尝试执行以下操作来添加“图像”字段:

        product['images'] = images

这会给出错误“TypeError: 'Product' object does not support item assignment”

        product.images = images 

什么都不做……

谁能指出我正确的方向?也欢迎任何有关如何以更好的方式进行此查询的提示!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您的“产品”模型是否具有具有正确数据类型的现有“图像”字段?

    否则,您将无法使用 FileObjects 列表对其进行更新。

    更好的解决方案可能是“ProductImage”和“Product”之间的多对一模型关系。

    然后,Django 将能够更好地通过 ORM 自动返回您的图像,而不是复杂的定制查询。 https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/

    【讨论】:

    • 产品没有现有的“图像”字段,我想在查询的响应中添加此字段。我已经考虑过了,但我也将 File 模型用于其他事情,所以我不想将它严格地与 Product 联系起来。 ProductImage 使用 Product 和 File 对象(其中文件是图像文件)。真的没有办法只在视图集中添加一个字段吗?不会那么难吧?
    • 我现在已将 ProductImage 设为自己的模型,并将 Product 作为外键。但是,我仍然不知道如何在查询中添加“图像”作为产品的字段。
    • 如果你能分享你的模型,那会很有帮助。
    【解决方案2】:

    如果不查看其他模型,很难给出准确的答案,但如果您编写更强大的查询并使用 annotate,则过滤器集和序列化器都可以访问带注释的字段。

    【讨论】:

    • 您想了解我的模型什么?我没有添加它们,因为我认为这与我的问题不太相关。我玩过 annotate 但我不确定它是如何工作的,我只能找到 Count() 的示例。可以举个例子吗?
    【解决方案3】:

    尝试使用字典,product_list = {} product_list[product] = images

    删除

            product.images = images # Doesn't do anything.
    
            # add product to product list
            product_list.append(product)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多