DRF: FieldError Cannot resolve keyword 'microcontrollers' into field when trying to join models
Я пытаюсь сериализовать две модели так, чтобы получить поле name из одной и остальные данные из другой. Однако когда я пытаюсь соединить их, я получаю следующую ошибку.
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
Я довольно новичок в Django и пытаюсь понять, какая часть кода вызывает проблему.
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
Вы допустили опечатку в методе get_queryset. Вы назвали поле в MeasurementsBasic 'microcontroller' и пытаетесь сделать запрос по полю 'microcontrollers'