2015-03-27 2 views
0

У меня есть эта модель, в которой я создал свойство форматировать DateTimeField. Однако я не могу получить/ссылаться на него. Пытались это до сих пор:Как получить доступ к свойствам из моделей в Django Queryset?

class DataForecast(models.Model): 
    date_time = models.DateTimeField() 
    rainfall_mm_per_10_min = models.FloatField(null=True) 
    wl_observed_m = models.FloatField(null=True) 
    wl_forecasted_m = models.FloatField(null=True) 

    def __unicode__(self): 
     return self.date_time 

    @property 
    def date_time_formatted(self): 
     import datetime 
     return self.date_time.strftime('%b %d, %Y %I:%M %p') 

И в то время как в моем views.py:

formatted = [dataforecast.date_time_formatted for dataforecast in DataForecast.objects.all()] 
getall = DataForecast.objects.all().values_list(formatted, "rainfall_mm_per_10_min", "wl_observed_m","wl_forecasted_m") 
return HttpResponse(json.dumps(list(getall),cls=DjangoJSONEncoder), content_type='application/json') 

возвращает ошибку:

Exception Value: 'list' object has no attribute 'split'

+0

Что вам нужно в переменной 'getall'? – ChillarAnand

+0

Как вы можете видеть, мне нужно отформатировать поле 'date_time' как то, что я сделал в своей модели. Итак, я добавил свойство. Я хочу, чтобы значение 'date_time' было отформатировано в моем запросе' getall'. –

ответ

1

Есть два способа сделать это:

Добавить. Значения()

DataForecast.objects.all().values() 

предоставит вам список для итерации.

В противном случае помните, что выходной сигнал является объектом, поэтому используйте object.key обозначение для получения значений

+0

Как добавить '.values' в запрос? Он возвращает новую ошибку: объект '' dict 'не имеет атрибута' date_time_formatted''. –

+0

в порядке, а если вы итерации через dict? – reabow

0

values/values_list принимает только необязательные аргументы поля. Они не будут использовать запрос в качестве аргументов.

Set юникода в возвращаемом значении

def __unicode__(self): 
    return unicode(self.date_time) 

Вы можете непосредственно сделать это

In [6]: DataForecast.objects.all().values("date_time", "rainfall_mm_per_10_min", "wl_observed_m","wl_forecasted_m") 
Out[6]: [{'date_time': datetime.datetime(2015, 3, 27, 6, 5, 36, tzinfo=<UTC>), 'wl_forecasted_m': 2.0, 'rainfall_mm_per_10_min': 1.0, 'wl_observed_m': 2.0}, {'date_time': datetime.datetime(2001, 1, 1, 0, 0, tzinfo=<UTC>), 'wl_forecasted_m': None, 'rainfall_mm_per_10_min': None, 'wl_observed_m': None}] 

или лучше попробовать

In [7]: DataForecast.objects.all().values() 
Out[7]: [{'wl_observed_m': 2.0, 'date_time': datetime.datetime(2015, 3, 27, 6, 5, 36, tzinfo=<UTC>), 'wl_forecasted_m': 2.0, u'id': 5, 'rainfall_mm_per_10_min': 1.0}, {'wl_observed_m': None, 'date_time': datetime.datetime(2001, 1, 1, 0, 0, tzinfo=<UTC>), 'wl_forecasted_m': None, u'id': 6, 'rainfall_mm_per_10_min': None}] 

Преобразование в JSon

In [19]: all = DataForecast.objects.all().values() 

In [20]: all 
Out[20]: [{'wl_observed_m': 2.0, 'date_time': datetime.datetime(2015, 3, 27, 6, 5, 36, tzinfo=<UTC>), 'wl_forecasted_m': 2.0, u'id': 5, 'rainfall_mm_per_10_min': 1.0}, {'wl_observed_m': None, 'date_time': datetime.datetime(2001, 1, 1, 0, 0, tzinfo=<UTC>), 'wl_forecasted_m': None, u'id': 6, 'rainfall_mm_per_10_min': None}] 

In [21]: for i in all: i['date_time'] = i['date_time'].strftime("%b %d %Y %H:%M:%S") 

In [22]: all 
Out[22]: [{'wl_observed_m': 2.0, 'date_time': 'Mar 27 2015 06:05:36', 'wl_forecasted_m': 2.0, u'id': 5, 'rainfall_mm_per_10_min': 1.0}, {'wl_observed_m': None, 'date_time': 'Jan 01 2001 00:00:00', 'wl_forecasted_m': None, u'id': 6, 'rainfall_mm_per_10_min': None}] 

In [23]: import json 

In [25]: json.dumps(list(all))                                     
Out[25]: '[{"wl_observed_m": 2.0, "date_time": "Mar 27 2015 06:05:36", "wl_forecasted_m": 2.0, "id": 5, "rainfall_mm_per_10_min": 1.0}, {"wl_observed_m": null, "date_time": "Jan 01 2001 00:00:00", "wl_forecasted_m": null, "id": 6, "rainfall_mm_per_10_min": null}]' 
+0

Он возвращает '' date_time ":" 2014-01-18T14: 00: 00 "', но я хотел, чтобы он был отформатирован как '18 января 2014 года 02:00 PM' –

+0

, вы его конвертируете, используя' strftime' like 'value .strftime ("% b% d% Y% H:% M:% S") 'или если вы хотите показать его в шаблоне, вы можете использовать' date' like '{{значение | дата:" D d MY " }} ' – ChillarAnand

+0

Как это сделать? Я передаю данные JSON в своем шаблоне. –

Смежные вопросы