'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 |
