Запрос 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()