'DRF: FieldError Cannot resolve keyword 'microcontrollers' into field when trying to join models

I am trying to serialize two models so that i get the name field from one and the rest of the data from another. However when i try to join them i get the following error.

FieldError at /api/CUTAQ/SE1/testdata/
Cannot resolve keyword 'microcontrollers' into field. Choices are: altitude, co, frame, hum, latitude, longitude, microcontroller, microcontroller_id, name, no2, o3, pres, so2, temp, time_received, time_taken

I am fairly new to Django and i am trying to understand what part of the code is causing the problem.

Models.py

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

Serializers.py

class TestData(serializers.Serializer):
    #name from microcontrollers, rest from measurementsbasic
    name = serializers.CharField(max_length=25)
    time_taken = serializers.DateTimeField()
    temp = serializers.FloatField()
    hum = serializers.FloatField()

Views.py

class TestData(generics.ListAPIView):
    serializer_class = TestData

    def get_queryset(self):
        name = self.kwargs['stationName']
        measurements = MeasurementsBasic.objects.filter(microcontrollers__name=name)[:5]

        return measurements

    def list(self, request, *args, **kwargs):
        res = super(TestData, self).list(request, *args, **kwargs)
        res.data = {"station_info": res.data}
        return res


Solution 1:[1]

You have typo in get_queryset method. You named field in MeasurementsBasic 'microcontroller' and you are trying to query by 'microcontrollers' field

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 TrueGopnik