StrudzonyWedrowiec
StrudzonyWedrowiec

Reputation: 61

Django filtering database with .value and calling foreign key

Once again I'm asking for your help. I want to return data in Json format from database and I need 3 values temperature, date and sensor.description. With little to no problem I can query and get 'temperature' and 'date' but I have hard time with getting that sensor description. This gives me temperature and date

sen = S280000020E3120.objects.filter(date__range=[dateo, datee]).values('date', 'temperature')

and this returns the description

desc = S280000020E3120.objects.filter(date__range=[dateo, datee]).last().sensor.description

And If I want to return json from that I have to do sen = list(sen) but when I try to append desc to sen by result = sen.append(desc) I got error

NoneType object is not iterable

Is it possible to get result in similar format?

{
    "ds": [
              {"date": "2020-06-19T16:23:16", "temperature": "27.4"}, 
              {"date": "2020-06-19T16:26:24", "temperature": "27.4"}, 
              {..rest of data..}, 
              sensor.description
          ]
}

My view.py

def chartData(request):
    fixm = datetime.min.time()
    fixd = datetime.max.time()
    dateo = '2020-06-19'
    datee = '2020-6-20'
    dateo = datetime.strptime(dateo, '%Y-%m-%d')
    datee = datetime.strptime(datee, '%Y-%m-%d')
    dateo = datetime.combine(dateo, fixm)
    datee = datetime.combine(datee, fixd)
    sen = S280000020E3120.objects.filter(date__range=[dateo, datee])

    #date = sen.values('date', )
    value = sen.values('date', 'temperature')
    lvalue=list(value)
    senName = sen.last().sensor.sensor_name
    #lvalue = lvalue.append(senName)
    result = {
            'ds': list(lvalue),
            }
    return JsonResponse(result, safe=False)

models.py

class S280000020E3120(models.Model):
    sensor = models.ForeignKey('Sensors', models.DO_NOTHING)
    temprature = models.DecimalField(max_digits=4, decimal_places=1)
    date = models.DateTimeField()

    class Meta:
        managed = False
        db_table = '28-0000020e3120'

class Sensors(models.Model):
    sensor_name = models.CharField(max_length=20)
    description = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'sensors'

Output I get

{"ds": [{"date": "2020-06-19T16:23:16", "temperature": "27.4"}, {"date": "2020-06-19T16:26:24", "temperature": "27.4"}, {...}]}

Output I want or something similar when I can easily get description because this data I hope will be graph with char.js or something

{"ds": [{"date": "2020-06-19T16:23:16", "temperature": "27.4"}, {"date": "2020-06-19T16:26:24", "temperature": "27.4"}, , {...},sensor.description]}

In this example I query only one table but at the end I need get data from 8 of these if this makes it any different.

Upvotes: 0

Views: 104

Answers (1)

Yves Hary
Yves Hary

Reputation: 312

I don't know how your sensor model looks like, but in general, this should do the trick:

sen = S280000020E3120.objects.filter(date__range=[dateo, datee]).values('date','temperature','sensor__description')

You can use Djangos field lookup syntax here too. See: https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.values

Upvotes: 1

Related Questions