【问题标题】:Django REST Framework, display specific foreign key data objectsDjango REST Framework,显示特定外键数据对象
【发布时间】:2021-07-08 17:17:17
【问题描述】:

我会直奔主题

这是我的 API 输出:

在图片中,我需要显示primary_placeholder 设置为True 的对象。 我找不到如何做的答案,我尝试在 REST Api 文档中搜索,但似乎没有任何效果,它总是显示每张图片

serializers.py:

views.py

Models.py(我目前正在使用的这两个)

有谁知道最简单和最快的方法是什么?我完全不知道,我已经尝试了大约 2 天。 如果有人感到困惑,数据库当前没有将 primary_placeholder 设置为 True 的图片

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    如果想用primary_placeholder=True展示产品图片,我们可以用prefetch_relatedPrefetch,请read this。 在您的上述情况下,我建议:

    views.py

    from django.db import models
    from your_app.models import Product, ProductPictures
    
    
    class ProductList(APIView):
        def get(self, request, format=None):
            products = Product.objects.all().prefetch_related(
                models.Prefetch(
                    "pictures",
                    queryset=ProductPictures.objects.filter(primary_placeholder=True)
                )
            )
            serializer = ProductSerializer(products, many=True)
            return Response(serializer.data)
    

    另一个建议:在模型ProductPictures字段model,最好将字段名称更改为product

    祝你好运。

    【讨论】:

    • 非常感谢!这正是我一直在寻找的答案。
    【解决方案2】:

    编写一个序列化方法字段并在其中过滤产品。

    class ProductSerializer(serializers.ModelSerializer):
        filtered_pictures = serializers.MethodField() 
        class Meta:
            model = Product
            fields = ['brand','model','prize','filtered_pictures']
        def get_filtered_pictures(self,obj):
            if obj.pictures.exists():
                queryset = obj.pictures.filter(primary_placeholder=True)  
                return ProductPictureSerializer(queryset, many=True).data
            else:
                return None
    
    
    
       
    

    【讨论】:

    • 这可能是正确的,但会导致查询集性能出现其他问题。也许击球手使用 .prefecth_related 和 Prefetch。
    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 2018-05-02
    • 2021-02-26
    • 2017-12-05
    • 2017-08-15
    • 2019-07-02
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多