简体   繁体   English

DRF Nested Serializer 字段未出现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM