django_tables и следование отношения один-к-одному в обратном направлении через связанного менеджера - PullRequest
0 голосов
/ 02 февраля 2011

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

http://elsdoerfer.name/docs/django-tables/types/models.html#spanning-relationships говорит, что я могу проходить через отношения, но мне трудно делать это "задом наперед".

Вот мои модели и таблица:

class Book(Model):
    isbn = ISBNField("ISBN", primary_key=True, editable=True, blank=True, null=False)

class SomeInfo(Model):
    book = OneToOneField(Book, primary_key=True, editable=False, blank=False, null=False, verbose_name = _('ISBN'), related_name='someinfo')
    title = CharField(_("Title"), editable=False, blank=False, null=True, max_length=250)

class MyInfo(Model):
    book = OneToOneField(Book, primary_key=True, editable=False, blank=False, null=False, verbose_name = _('ISBN'), related_name='myinfo')
    average_price = DecimalField(_("Average price"), editable=False, null=True, max_digits=6, decimal_places=2)

class Query(Model):
    book = ForeignKey(Book, editable=True, blank=True, null=True, verbose_name = _('ISBN'))
    max_price = DecimalField(_('Maximum price'), null=True, max_digits=6, decimal_places=2)

class MyTable(ModelTable):
    my_average_price = tables.Column(data="book__myinfo__average_price")
    my_title = tables.Column(data="book__someinfo__title")
    class Meta:
        model = Query

При попытке использовать, например, my_average_price в шаблоне, я получаю эту ошибку:

TemplateSyntaxError at /list/

Caught ValueError while rendering: Could not resolve myinfo from book__myinfo__average_price

Есть идеи, как заставить это работать?

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

1 Ответ

1 голос
/ 03 февраля 2011

Это работает для меня, при условии, что существует связанный экземпляр SomeInfo или MyInfo. Ошибка должна возникать только в том случае, если это не так. То есть к каждой книге в таблице должны быть прикреплены SomeInfo и MyInfo.

Это связано с тем, что код в django_tables/models.py:BoundModelRow._default_render вызовет эту ошибку, если один из атрибутов в цепочке не существует, что имеет место в случае отсутствия связанного экземпляра: Book.myinfo не существует как атрибут, если MyInfo не существует для экземпляра Book.

Вероятно, это следует считать ошибкой в ​​django-таблицах. Вместо того, чтобы просто переключаться между атрибутами объекта, он должен посмотреть на instance._meta, в котором поля базы данных фактически определены. Если он определит, что обратный метод доступа OneToOne существует, но не имеет соответствующего атрибута, он просто примет нулевое значение, а не вызовет исключение.

Я сообщил об этом здесь как об ошибке: https://github.com/miracle2k/django-tables/issues/issue/11 Однако я не уверен, когда приступлю к работе над этим. Патчи, конечно, приветствуются.

...