Запрос Django со связанными моделями показывает только поля одной модели

У меня есть три связанных модели, и я хочу сделать запрос, чтобы получить комбинацию полей из всех трех моделей.

invoice_select = Ordered_item.objects.filter(oi_order = o_id).select_related()

генерирует SQL-оператор, который я могу проверить с помощью debug_toolbar. Оператор SQL содержит все поля связанных моделей.

Отправка результата запроса в html-файл с

 return render_to_response('invoice_select.html', {'invoice_select':invoice_select} 

предоставляет только выражение, которое было определено для модели Ordered_item с:

   def __unicode__(self):
   return u'%s -- %s -- %s' % (self.oi_order, self.oi_pos, self.oi_item) 

Таким образом, результат запроса выглядит так:

{'invoice_select': [<Ordered_item: 1109231733 -- 01 -- BP-0516-aa>]} 

это именно те поля, которые определены в def unicode(self):

Что я могу сделать, чтобы добавить больше полей к результату запроса? Почему поля в SQL не отображаются в результате запроса?

Любая помощь будет высоко оценена.

2 ответа

Вы просто смотрите на строковое представление объекта, которое, очевидно, использует __unicode__ метод. Поля есть, конечно, если вы обращаетесь к объектам напрямую.

Метод __unicode__ автоматически вызывается, когда вы ссылаетесь на объект как на строку. Вы можете просто поместить интересующие вас поля в метод __unicode__ (при условии, что модель изготовителя):

def __unicode__(self):
   return u'%s -- %s -- %s -- %s -- %s' % (self.oi_order, self.oi_pos, self.oi_item,
       self.manufacturer.name, self.manufacturer.favorite_stuffed_animal) 

Если вы не хотите помещать это в метод __unicode__, который действительно используется для других целей, вы можете легко поместить его в какой-то отдельный метод и напрямую вызывать его, а не косвенно вызывать метод __unicode__.

Также обратите внимание, что если производитель может быть нулевым, вам нужно обработать это, возможно, с помощью блока try-catch.

Вот как может выглядеть отдельный метод:

def get_str(self):
    return u'%s %s' % (self.oi_order, self.manufacturer.name)

И тогда, если у вас есть экземпляр:

str = oi.get_str()
Другие вопросы по тегам