POST id объектов и извлечение связанных с ним вложенных таблиц
Может ли кто-нибудь посоветовать мне, как поступить с получением данных, таких как в этом примере JSON:
[
{
"deviceid": 4,
"devicename": "###",
"device_measurment": {
"deviceid": 4,
"measurement": "31.8",
}
},
]
How is it right now:
[
{
"deviceid": 4,
"devicename": "###",
},
{
"deviceid": 4,
"measurement": "31.8",
},
]
Я понимаю проблему и почему я получаю такой ответ, но я не могу решить эту проблему через сериализатор. на данный момент у меня следующее
Views из itertools import chain
class RetrieveSpecificDevicesView(APIView):
permission_classes = [permissions.IsAuthenticated]
serializer_class = SpecificDeviceSerializer
def get_object(self, queryset=None):
obj = self.request.data
return obj
def post(self, request):
if self.request.method == 'POST':
self.object = self.get_object()
serializer = SpecificDeviceSerializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
if serializer.is_valid():
obj1= Devices.objects.using('yelcloud').filter(deviceid=serializer.data.get("deviceid"))
obj2= Measurements.objects.using('yelcloud').filter(deviceid=serializer.data.get("deviceid"))
dats= chain(obj1, obj2)
if Devices.objects.using('yelcloud').filter(deviceid=serializer.data.get("deviceid")).exists():
data = serializers.serialize('json', dats)
return HttpResponse(data, content_type="application/json")
return JsonResponse(serializer.erorr, status=status.HTTP_201_CREATED)
<
class SpecificDeviceSerializer(serializers.Serializer):
deviceid = serializers.CharField(required=True)
class MeasurmentsSerializer(serializers.ModelSerializer):
class Meta:
model = Measurements
fields = ('measurementid','measurement')
Модели
введите описание изображения здесь
Решение: Сериализатор
class SpecificDeviceSerializer(serializers.ModelSerializer):
measurments = serializers.SerializerMethodField()
def get_measurments(self, obj):
device_measurements = obj.measurment_details.last()
serializer = MeasurmentsSerializer(device_measurements)
return serializer.data
class Meta:
model = Devices
fields = ('devicename','measurments')
Виды
class RetrieveSpecificDevicesView(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticated]
serializer_class = SpecificDeviceSerializer
def get_queryset(self):
return Devices.objects.using('yelcloud').filter(deviceid=self.request.data.get("deviceid"))
JSON:
[
{
"devicename": "RTMU 3068",
"measurments": {
"measurementid": 2980465,
"measurement": "25.6"
}
}
]
Документация: Лучший для этого случая