[英]DRF Nested Serializer field not appearing
I'm trying to retrieve some data from two related models however i am unable (or would like to avoid to be more precise) to change the models.我正在尝试从两个相关模型中检索一些数据,但是我无法(或者想避免更精确)更改模型。 The problem is that the nested serializer doesn't return the data of the first model.
问题是嵌套序列化器没有返回第一个 model 的数据。
I have the following serializers我有以下序列化程序
class NameSerializer(serializers.ModelSerializer):
class Meta:
model = Microcontrollers
fields = ['name']
class DataCUTSerializer(QueryFieldsMixin, serializers.ModelSerializer):
stationName = NameSerializer(read_only=True)
class Meta:
model = MeasurementsBasic
fields = ['stationName', 'temp', 'hum']
def to_representation(self, instance):
representation = super().to_representation(instance)
return {'timestamp': instance.time_taken,
**representation}
return representation
These serializers use the following models这些序列化器使用以下模型
class MeasurementsBasic(models.Model):
microcontroller = models.OneToOneField('Microcontrollers', related_name='measurements_basic', primary_key=True, on_delete=models.CASCADE)
time_taken = models.DateTimeField()
time_received = models.DateTimeField(blank=True, null=True)
frame = models.IntegerField(blank=True, null=True)
temp = models.FloatField(blank=True, null=True)
hum = models.FloatField(blank=True, null=True)
pres = models.FloatField(blank=True, null=True)
co = models.FloatField(blank=True, null=True)
no2 = models.FloatField(blank=True, null=True)
o3 = models.FloatField(blank=True, null=True)
so2 = models.FloatField(blank=True, null=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True)
longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True)
altitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True)
name = models.CharField(max_length=30, blank=True, null=True)
class Meta:
managed = True
db_table = 'measurements_basic'
unique_together = (('microcontroller', 'time_taken'),)
class Microcontrollers(models.Model):
name = models.CharField(max_length=25)
serial_number = models.CharField(max_length=20, blank=True, null=True)
type = models.CharField(max_length=15, blank=True, null=True)
software = models.CharField(max_length=20, blank=True, null=True)
version = models.CharField(max_length=5, blank=True, null=True)
date_installed = models.DateField(blank=True, null=True)
date_battery_last_replaced = models.DateField(blank=True, null=True)
source = models.CharField(max_length=10, blank=True, null=True)
friendly_name = models.CharField(max_length=45, blank=True, null=True)
private = models.IntegerField()
datetime_updated = models.DateTimeField(db_column='DateTime_Updated') # Field name made lowercase.
class Meta:
managed = True
db_table = 'microcontrollers'
verbose_name_plural = "Microcontrollers"
def __str__(self):
return self.friendly_name
Lastly my view最后是我的看法
class TestData(generics.ListAPIView):
serializer = DataCUTSerializer
def get_queryset(self):
final = []
allNames = ['SE1','SE3']
for i in range(len(allNames)):
measurements = MeasurementsBasic.objects.select_related('microcontroller').filter(microcontroller__name=allNames[i]).order_by('-time_taken')[:entries]
final = list(chain(final, measurements))
return final
def list(self, request, *args, **kwargs):
res = super(TestData, self).list(request, *args, **kwargs)
res.data = {"stations": res.data}
return res
My expected outcome is to get a json with timestamp, name, temp and hum.我的预期结果是获得带有时间戳、名称、温度和嗡嗡声的 json。 However i do not actually receive the name and get this instead.
但是我实际上并没有收到这个名字而是得到这个。
{
"stations": [
{
"timestamp": "2022-03-07T14:51:53",
"temp": 16.18,
"hum": 62.596
},
{
"timestamp": "2022-03-07T14:42:48",
"temp": 16.1,
"hum": 62.856
},
{
"timestamp": "2022-03-07T14:52:49",
"temp": 18.43,
"hum": 62.72
},
{
"timestamp": "2022-03-07T14:43:43",
"temp": 18.239,
"hum": 62.134
}
]
}
I checked the response and the data received is correct.我检查了响应,收到的数据是正确的。 Any help would be appreciated.
任何帮助,将不胜感激。
i think the problem is that you never passed data through serializer, try something like this:我认为问题是您从未通过序列化程序传递数据,请尝试这样的事情:
views.py视图.py
from rest_framework.response import Response
from rest_framework import status
class TestData(generics.ListAPIView):
serializer = DataCUTSerializer
def get_queryset(self):
allNames = ['SE1','SE3']
# use list comprehension to better performance
final = [
chain(final, MeasurementsBasic.objects.select_related('microcontroller').filter(microcontroller__name=allNames[i]).order_by('-time_taken')[:entries]) for i in range(len(allNames))
]
return final
def list(self, request, *args, **kwargs):
serializer = DataCUTSerializer(self.get_queryset(), many=True)
return Response({"stations": serializer.data}, status=status.HTTP_200_OK)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.