Home > database >  Django Foreign Keys connections
Django Foreign Keys connections

Time:04-12

I have a model Field that has a OneToMany connections with TreeSensor and WeatherStation model. Im trying to pass over the queries of each treesensor/weatherstation model that match the id of each different field but get a Field 'id' expected a number but got <built-in function id>. .How do i fix that? Maybe change something on the filter ?

class Field(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True, default=None)
    friendly_name = models.CharField(max_length=24, blank=True)
    soil_type = models.CharField(max_length=24, choices=SOIL_TYPES, blank=True)  
    cultivation = models.CharField(max_length=128, choices=CULTIVATIONS, blank=True)  
    kml = models.FileField(upload_to = user_directory_path_kml, null=True, blank=True)

class TreeSensor(models.Model):  
    field = models.ForeignKey(Field, on_delete=models.CASCADE)
    ...

class WeatherStation(models.Model):
    field = models.ForeignKey(Field, on_delete=models.CASCADE)
    ...

view

def map(request):
    field_list = models.Field.objects.filter(user = request.user)
    tree_sensors = models.TreeSensor.objects.filter(field__pk = id)
    weather_stations = models.WeatherStation.objects.filter(field__pk = id)
    context = {
        "title": "Map",
        "field_list": field_list,
        "tree_sensors": tree_sensors,
        "weather_stations" : weather_stations,
    }
    template = 'agriculture/map.html'
    return render(request, template, context)

CodePudding user response:

On your view you are filtering some field called field by id, which is not defined nowehere....

You have a queryset of Fields, so probably you should do something like this:

def map(request):
    field_list = models.Field.objects.filter(user = request.user).values_list('id', flat=True)
    tree_sensors = models.TreeSensor.objects.filter(field__pk__in = field_list)
    weather_stations = models.WeatherStation.objects.filter(field__pk__in = field_list)

CodePudding user response:

@Walucas your approach was correct it was kinda different though . It works out like this : view

def map(request):

    field_list = models.Field.objects.filter(user = request.user)
    tree_sensors = models.TreeSensor.objects.filter(field_id__in = field_list.values_list('id',flat=True))
    weather_stations = models.WeatherStation.objects.filter(field_id__in = field_list.values_list('id',flat=True))
    context = {
        "title": "Map",
        "field_list": field_list,
        "tree_sensors": tree_sensors,
        "weather_stations" : weather_stations,
    }
    template = 'agriculture/map.html'
    return render(request, template, context)
  • Related