如何通过Django Rest框架访问嵌套对象数组中的值?

时间:2020-10-28 19:29:00

标签: python django api rest django-rest-framework

我无法终生解决这个问题,而且我是Django的新手,所以很多事情都没有道理,但我已经失去了主意。

预期结果:

所以,我希望以对象或对象数组的形式将4个嵌套对象发送到我的前端(反应),以便我可以通过它们的特定标签访问它们。例如name = valname['name']details = valname['deets']

问题:

我有一个程序可以将数据传递回我的api视图。其格式如下:{'valname': {'name': [...], 'name': [...]}, 'valname': {'name': [...], 'name': [...]}, 'valname': {'name': [...], 'name': [...]}}

我已经尝试了几乎所有方法来访问valname ['name'],但是当数据通过序列化程序传递时,它作为字符串返回,因此其字面意义为{'valname': "{'name': "['...']"}"

这是我的序列化器:

class CalcSerializer(serializers.ModelSerializer):
    cleanser, serum, moisturizer, sunscreen = (serializers.ListField(required=False) for _ in range(4))
    class Meta:
        model = Skincare
        fields = ['cleanser', 'serum', 'moisturizer', 'sunscreen']
        depth = 1

class ResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = Skincare
        fields = ['cleanser', 'serum', 'moisturizer', 'sunscreen']
        depth = 1

我的视图获取并发布

@api_view(['GET'])
def list_result(request):
    data = Skincare.objects.all()
    serializer = ResultSerializer(data, many=True)
    # print(serializer.data)
    return Response(serializer.data)

@api_view(['POST'])
def postSearch(request):
    Skincare.objects.all().delete()
    data = start(request.data)
    serializer = CalcSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        # print(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        print(serializer.errors)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我尝试过的内容

我已阅读https://www.django-rest-framework.org/api-guide/fields/此页面,https://www.django-rest-framework.org/api-guide/serializers/#including-extra-context此页面以及此Django REST Framework POST nested objects

根据文档,我已经尝试通过使用

创建嵌套列表
cleanser, serum, moisturizer, sunscreen = (serializers.ListField(
    child=serializers.CharField()
) for _ in range(4))

我尝试创建自己的序列化器

def to_representation(self, instance):
    data = super().to_representation(instance)
    data['cleanser'] = SkinSerializer(Skincare.objects.get(pk=data['cleanser'])).data
    print(data['cleanser']) #error: Field 'id' expected a number but got ['...', '...']

我已经尝试在Calc序列化程序和结果一中实现^。

我确定解决方案很简单,但是我不知道该怎么做。感谢您能提供的任何帮助。

0 个答案:

没有答案