Non-relational field given in select_related: ' '. Choices are: (none)
Asked Answered
G

1

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?

Graffito answered 25/2, 2019 at 8:24 Comment(2)
Just do Sensor.objects.select_related('measure'). After that you may get the attributes from the queryset.Seduction
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 and 1.8.Structure
S
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.

Sarmentum answered 25/2, 2019 at 8:40 Comment(2)
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?Graffito
@Graffito ].measure.dateUnalloyed

© 2022 - 2024 — McMap. All rights reserved.