我无法终生解决这个问题,而且我是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序列化程序和结果一中实现^。
我确定解决方案很简单,但是我不知道该怎么做。感谢您能提供的任何帮助。