9

I have two models from different apps:

class Measure(models.Model):
    date = models.DateTimeField(default="2018-01-23 15:55")
    average = models.FloatField(default=0)

class Sensor(models.Model):
    measure=models.ForeignKey(Measure, on_delete=models.CASCADE)
    value= models.FloatField(default=0)

I'm calling all data coming from sensors as follow:

new_context = Sensor.objects.select_related('measure__date')

However, I receive this error:

django.core.exceptions.FieldError: Non-relational field given in select_related: 'date'. Choices are: (none)

from documentation, I should be using select_related instead of prefetch_related, and the call seems to be coherent.

Am I missing something?

Alvaro
  • 1,430
  • 2
  • 23
  • 41
  • 1
    Just do `Sensor.objects.select_related('measure')`. After that you may get the attributes from the queryset. – art Feb 25 '19 at 08:39
  • Similar issues can arise when upgrading old Django code. This type of error would silently fail before Django 1.10 (or 1.8 for non-nested). See release notes for [1.10](https://docs.djangoproject.com/en/3.0/releases/1.10/#select-related-prohibits-non-relational-fields-for-nested-relations) and [1.8](https://docs.djangoproject.com/en/3.0/releases/1.8/#select-related-now-checks-given-fields). – djvg Feb 18 '20 at 20:36

1 Answers1

6

In select_related only fields that are ForeignKey should be set. In your case the issue it that date field is a DateTimeField and not ForeignKey.

So in order to solve it just do it:

new_context = Sensor.objects.select_related('measure')

You can see examples of using syntax in docs.

Sergey Pugach
  • 5,561
  • 1
  • 16
  • 31
  • thanks! By doing this if I call `print (new_context[0])` i get `Sensor object (688)`. However, if I do `print (new_context[0].date)` then I get the error **AttributeError: 'Sensor' object has no attribute 'date'**. How is that possible? – Alvaro Feb 25 '19 at 09:08
  • 2
    @Alvaro `].measure.date` – Ivan Starostin Feb 25 '19 at 09:24