首页 > 解决方案 > 获取响应序列化程序的列表

问题描述

我试图在我的序列化程序响应中做这样的事情 -

[
    {
        "user": {
            "hnid": "87481adf-5a6e-4995-bb21-cc4258f97a46",
            "username": "Md.AbcAhmeddsf #7TJG2GLQ",
            "profile_img": null,
            "full_name": "Md. Abc Ahmeddsf"
        },
        "supporting": 
          "id":1 ,
          "user": {
            "hnid": "87481adf-5a6e-4995-bb21-cc4258f97a46",
            "username": "Md.AbcAhmeddsf #7TJG2GLQ",
            "profile_img": null,
            "full_name": "Md. Abc Ahmeddsf"
        },
        "id":2 ,
          "user": {
            "hnid": "87481adf-5a6e-4995-bb21-cc4258f97a46",
            "username": "Md.AbcAhmeddsf #7TJG2GLQ",
            "profile_img": null,
            "full_name": "Md. Abc Ahmeddsf"
        },
    }
]

相反,我得到了这个-

[
    {
        "user": {
            "hnid": "87481adf-5a6e-4995-bb21-cc4258f97a46",
            "username": "Md.AbcAhmeddsf #7TJG2GLQ",
            "profile_img": null,
            "full_name": "Md. Abc Ahmeddsf"
        },
        "supporting": "c5f408bd-a07f-4ee5-b7a9-b2dee8f67634"
    },
    {
        "user": {
            "hnid": "87481adf-5a6e-4995-bb21-cc4258f97a46",
            "username": "Md.AbcAhmeddsf #7TJG2GLQ",
            "profile_img": null,
            "full_name": "Md. Abc Ahmeddsf"
        },
        "supporting": "d0a04c7b-6399-44db-ba7c-4ef39ae7e59c"
    }
]

我怎么能这样..这是我的models.py

class Supports(models.Model):
    user = models.ForeignKey(HNUsers, on_delete=models.CASCADE, related_name='supporting_user')
    supporting = models.ForeignKey(HNUsers, on_delete=models.DO_NOTHING, related_name="supportings")
    is_support = models.BooleanField(blank=True, null=True, default=False)

    class Meta:
        verbose_name_plural = "Supports"

这是我的Serializer.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = HNUsers
        fields = (
            'hnid',
            'username',
            'profile_img',
            'full_name',
        )

class SupportSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True, many=False)
    # supporting = SupportingUserSerializer(read_only=True, many=False)
    class Meta:
        model = Supports
        fields = (
            'user',
            'supporting',
        )

这是我的意见.py

@api_view(['GET', 'POST'])
@permission_classes((permissions.AllowAny,))
@parser_classes([FormParser, MultiPartParser])
def create_support(request):
    data = request.data
    print(data)
    if request.method == 'POST':
        serializer = SupportSerializer(data=request.data)
        print(serializer.is_valid())
        if serializer.is_valid():
            try:
                support_field = Supports.objects.get(user=data['user'], supporting=data['supporting'])
                print("dsajdsadlsa")
                print("sadsadsad",support_field)
                if support_field.is_support == True:
                    return Response({"Error": "You have already supported the user"}, status=status.HTTP_400_BAD_REQUEST)
            except Supports.DoesNotExist:
                serializer.save(is_support=True)
                return Response({"Success": "You have successfully supporting the user"}, status=status.HTTP_201_CREATED)

    if request.method == 'GET':
        data = Supports.objects.filter(user=data['user'])
        serializer = SupportSerializer(data, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

非常感谢您对此的任何帮助

标签: djangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


在你的SupportSerializer你需要明确声明序列化程序,supporting就像你做的那样user

序列化程序.py

class UserSerializer(ModelSerializer):

    class Meta:
        model = HNUsers
        fields = [...]

class SupportSerializer(ModelSerializer):

    user = UserSerializer(...)
    supporting = UserSerializer(...) # add this line

    class Meta:
        model = Supports
        fields = ['user', 'supporting', ...]

然后,您可以使用 aModelViewSet来获取您正在寻找的行为:

视图.py

from rest_framework import viewsets

class SupportViewSet(viewsets.ModelViewSet):

    serializer_class = SupportSerializer
    queryset = Supports.objects.order_by('id')

现在您的 json 响应应如下所示:

[
  {
    'id' : 1,
    'user' : {
       'hnid' : '...',
       'username' : '...',
       ...,
    },
    'supporting' : {
       'hnid' : '...',
       'username' : '...',
       ...,
    }
  },
  {
    'id' : 2,
    'user' : {
       'hnid' : '...',
       'username' : '...',
       ...,
    },
    'supporting' : {
       'hnid' : '...',
       'username' : '...',
       ...,
    }
  },
]

推荐阅读