【问题标题】:django rest framework: include related model fields in same pathdjango rest框架:在同一路径中包含相关的模型字段
【发布时间】:2017-05-26 10:41:55
【问题描述】:
class ProductSerializer(serializers.ModelSerializer):

    class Meta:
       model = Product
       fields = ('id','product_id','sku', 'title','price','images')

class WishListSerializer(serializers.ModelSerializer):
      product = ProductSerializer()

      class Meta:
        model = WishList
        fields = ('wishlist_id','product',)

我有两个序列化程序。愿望清单和产品。我想列出所有愿望清单产品。它现在工作正常。但产品细节在“产品”关键元素中。我可以删除该产品密钥,并显示产品详细信息以及 wishlist_id 吗?

目前结果:

 {
      "count": 2,
      "next": null,
      "previous": null,
      "results": [
        {
          "wishlist_id":1,
          "product": {
            "id": 1460,
            "product_id": "04396134-3c90-ea7b-24ba-1fb0db11dbe5",
            "sku": "bb4sd817",
            "title": "Trinity Belt",

          }
        },
        {
          "wishlist_id":2,
          "product": {
            "id": 596,
            "product_id": "52588d22-a62c-779b-8044-0f8d9892e853",
            "sku": "ml346",
            "title": "Martina Liana",
          }
        }
      ]
    }

预期结果:

    {
      "count": 2,
      "next": null,
      "previous": null,
      "results": [
        {
          "wishlist_id":1,
          "id": 1460,
          "product_id": "04396134-3c90-ea7b-24ba-1fb0db11dbe5",
          "sku": "bb4sd817",
          "title": "Trinity Belt",

        },
        {
          "wishlist_id":2,
          "id": 596,
          "product_id": "52588d22-a62c-779b-8044-0f8d9892e853",
          "sku": "ml346",
          "title": "Martina Liana",
        }
      ]
    }

【问题讨论】:

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


    【解决方案1】:

    这是一个非常糟糕的做法,你需要付出很多努力来实现序列化和反序列化,尤其是在 Post、Update 等情况下。 我可以想到2种方法。 1)您可以在 WishListSerializer 中使用缺少的字段作为 SerializerMethodField 例子

    product_id = serializers.SerializerMethodField()
    
     def get_product_id(self, obj):
            return obj.get_product().product_id
    

    2)

    class WishListSerializer(serializers.HyperlinkedModelSerializer):
        product_id = serializers.CharField(source='product.product_id')
        .......
    
        class Meta:
            model = WishList
            fields = (product_id, ......)
    

    【讨论】:

      【解决方案2】:

      您可以“取消嵌套”to_representation 中的项目 上面的文档https://www.django-rest-framework.org/api-guide/fields/#custom-fields

      ...
      class WishListSerializer(serializers.ModelSerializer):
          product = ProductSerializer()
      
          class Meta:
              model = WishList
              fields = ('wishlist_id', 'product',)
      
          # add 
          def to_representation(self, instance):
              data = super().to_representation(instance)
              flat_data = dict(wishlist_id=data['wishlist_id'], **data['product']) # construct (new dict) flat data 
              # or you could restructure same dict: data.update(data.pop('product')) 
              return flat_data
      
      

      【讨论】:

        猜你喜欢
        • 2014-06-24
        • 2016-11-09
        • 2017-02-04
        • 2013-01-12
        • 2021-12-31
        • 2018-07-21
        • 2020-12-24
        相关资源
        最近更新 更多