如何在django rest框架中重新排序序列化器响应?

问题描述 投票:-1回答:1

目前我得到了以下响应,因为嵌套的序列化器。我在购物车序列化器中嵌套了产品序列化器。通过这样做,我得到以下结果。但是想要产品的所有属性在主要部分(产品外部,如下所示)

{
            "product": {
                "id": 1,
                "name": "Ghost Peanut Butter Cereal Milk Whey Protein",
                "product_code": "B07FLJYP5M",
                "description": "Ghost products feature a 100% transparent label that fully discloses the dose of each active ingredient.",
                "price": "5000.00",
                "photo": "https://images-na.ssl-images-amazon.com/images/I/61WZazUpWsL._SX522_.jpg",
                "link_to_amazon": "https://www.amazon.com/dp/B07FLJYP5M/?tag=1230568-20"
            },
            "description": null,
            "default": "Yes"
        }

但是我希望得到如下响应:

{
       "name": "Ghost Peanut Butter Cereal Milk Whey Protein",
       "product_code": "B07FLJYP5M",
       "description": "Ghost products feature a 100% transparent label that fully discloses the dose of each active ingredient.",
       "price": "5000.00",
       "photo": "https://images-na.ssl-images-amazon.com/images/I/61WZazUpWsL._SX522_.jpg",
       "link_to_amazon": "https://www.amazon.com/dp/B07FLJYP5M/?tag=1230568-20",
       "description": null,
       "default": "Yes"
    }

models.朋友

class DefaultCart(models.Model):
    # Default Cart in Model class
    YES = 'Yes'
    NO = 'No'
    DEFAULT_CHOICES = (
        (YES, 'Yes'),
        (NO, 'No'),
    )

    product = models.ForeignKey(Product, related_name='product', on_delete=models.CASCADE)
    description = models.TextField(blank=True, null=True)
    default = models.CharField(
        max_length=3,
        choices=DEFAULT_CHOICES,
        default=YES,
    )

serialize认识.朋友

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields=(
            'id','name','product_code','description','price','photo','link_to_amazon'
        )

class DefaultCartSerializer(serializers. HyperlinkedModelSerializer):    
    product = ProductSerializer(read_only=True)
    class Meta:        
        model = DefaultCart        
        fields = (
            'product',
            'description',
            'default'
        )   
        read_only_fields = ('id',)

views.朋友

def index(request):
    # retrive all default_carts or create new default_cart
    if request.method == 'GET':
        default_carts = DefaultCart.objects.all()
        serializer = DefaultCartSerializer(default_carts, many=True)
        return Response(serializer.data)
django-rest-framework serializer
1个回答
0
投票

在这里,我通过在serializers.py中执行以下操作来解决我的问题

class DefaultCartSerializer(serializers. ModelSerializer): 
    product_id =   serializers.IntegerField(
            required=True,
            validators=[UniqueValidator(queryset=DefaultCart.objects.all())]
            )
    name = serializers.SerializerMethodField('get_product_name')
    product_code = serializers.SerializerMethodField('get_product_product_code')
    price = serializers.SerializerMethodField('get_product_price')
    photo = serializers.SerializerMethodField('get_product_photo')
    link_to_amazon = serializers.SerializerMethodField('get_product_link_to_amazon')
    class Meta:        
        model = DefaultCart        
        fields = (
            'id',
            'product_id',
            'description',
            'default',
            'name',
            'product_code',
            'price',
            'photo',
            'link_to_amazon'
        )   
        read_only_fields = ('id',)

    def get_product_name(self, obj):
        return obj.product.name

    def get_product_product_code(self,obj):
        return obj.product.product_code

    def get_product_price(self, obj):
        return obj.product.price

    def get_product_photo(self, obj):
        return obj.product.photo

    def get_product_link_to_amazon(self, obj):
        return obj.product.link_to_amazon
© www.soinside.com 2019 - 2024. All rights reserved.