代码之家  ›  专栏  ›  技术社区  ›  Dave

如何使用Django序列化程序在JSON中显示模型的depdent字段?

  •  0
  • Dave  · 技术社区  · 6 年前

    from django.db import models
    
    from address.models import AddressField
    from phonenumber_field.modelfields import PhoneNumberField
    from address.models import State
    from address.models import Country
    
    
    class CoopTypeManager(models.Manager):
    
        def get_by_natural_key(self, name):
            return self.get_or_create(name=name)[0]
    
    
    class CoopType(models.Model):
        name = models.CharField(max_length=200, null=False)
    
        objects = CoopTypeManager()
    
        class Meta:
            unique_together = ("name",)
    
    
    class Coop(models.Model):
        name = models.CharField(max_length=250, null=False)
        type = models.ForeignKey(CoopType, on_delete=None)
        address = AddressField(on_delete=models.CASCADE)
        enabled = models.BooleanField(default=True, null=False)
        phone = PhoneNumberField(null=True)
        email = models.EmailField(null=True)
        web_site = models.TextField()
    

    然后我创建了以下序列化程序。。。

    from rest_framework import serializers
    from maps.models import Coop, CoopType
    
    
    class CoopSerializer(serializers.ModelSerializer):
        class Meta:
            model = Coop
            fields = ['id', 'name', 'type', 'address', 'enabled', 'phone', 'email', 'web_site']
    
        def create(self, validated_data):
            """
            Create and return a new `Snippet` instance, given the validated data.
            """
            return Coop.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            """
            Update and return an existing `Coop` instance, given the validated data.
            """
            instance.name = validated_data.get('name', instance.name)
            instance.type = validated_data.get('type', instance.type)
            instance.address = validated_data.get('address', instance.address)
            instance.enabled = validated_data.get('enabled', instance.enabled)
            instance.phone = validated_data.get('phone', instance.phone)
            instance.email = validated_data.get('email', instance.email)
            instance.web_site = validated_data.get('web_site', instance.web_site)
            instance.save()
            return instance
    
    class CoopTypeSerializer(serializers.ModelSerializer):
        class Meta:
            model = CoopType
            fields = ['id', 'name']
    
        def create(self, validated_data):
            """
            Create and return a new `CoopType` instance, given the validated data.
            """
            return CoopType.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            """
            Update and return an existing `Snippet` instance, given the validated data.
            """
            instance.name = validated_data.get('name', instance.name)
            instance.save()
            return instance
    

    我试图创建一个API,将我的模型显示为JSON。我创建了这个视图文件

    from maps.models import Coop
    from maps.serializers import CoopSerializer
    from django.http import Http404
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    
    
    class CoopList(APIView):
        """
        List all coops, or create a new coop.
        """
        def get(self, request, format=None):
            coops = Coop.objects.all()
            serializer = CoopSerializer(coops, many=True)
            return Response(serializer.data)
    
        def post(self, request, format=None):
            serializer = CoopSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
    
    class CoopDetail(APIView):
        """
        Retrieve, update or delete a coop instance.
        """
        def get_object(self, pk):
            try:
                return Coop.objects.get(pk=pk)
            except Coop.DoesNotExist:
                raise Http404
    
        def get(self, request, pk, format=None):
            coop = self.get_object(pk)
            serializer = CoopSerializer(coop)
            return Response(serializer.data)
    
        def put(self, request, pk, format=None):
            coop = self.get_object(pk)
            serializer = CoopSerializer(coop, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    
        def delete(self, request, pk, format=None):
            coop = self.get_object(pk)
            coop.delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
    

    然而,我的依赖模型CoopType并没有显示为JSON。仅显示其主键,例如。。。

    {
        "id": 915,
        "name": "Young Men's Educational Network",
        "type": 10,
        "address": 790,
        "enabled": true,
        "phone": null,
        "email": null,
        "web_site": "www.ymenchi.com/"
    },
    

    如何让依赖模型出现在JSON中?

    0 回复  |  直到 6 年前
        1
  •  2
  •   JPG    6 年前

    覆盖 to_representation(...) 序列化程序的方法

    class CoopSerializer(serializers.ModelSerializer):
        # other code snippets
        def to_representation(self, instance):
            rep = super().to_representation(instance)
            rep['type'] = CoopTypeSerializer(instance.type).data
            return rep

    参考: DRF: Simple foreign key assignment with nested serializers?

    推荐文章