Вывод данных из нескольких моделей в виде плоской таблицы в Django - PullRequest
0 голосов
/ 08 февраля 2012

Я пытаюсь отобразить данные из нескольких моделей (внешний ключ) в виде таблицы.

class Author(models.Model):
    name = models.CharField(max_length=250)

class Book(models.Model):
    title = models.CharField(max_length=250)
    isbn = models.CharField(max_length=250)
    author = models.ManyToManyField(Author)

Ожидаемый результат:

  • Книга 1 - isbn1 - Автор1
  • Книга 1 - isbn1 - Автор2
  • Книга 2 - isbn2 - Автор3
  • Книга 3 - isbn3 - Автор1

Теперь я могу запрашивать две модели, используя различные фильтры и иметь соответствующие им объекты списка. Как я могу отобразить эти два объекта списка в шаблоне с меньшим количеством кода?

Один из способов, который я могу придумать, - это перебрать эти два списка и создать список dict с соответствующими ключами для столбцов и передать этот список шаблону. Есть ли лучший подход к этому?

Текущий код

def getresult(params):
    print "printing dict ", params
    titles  = params.getlist('titles')
    authors_input = params.getlist('authors')
    ...
    books = Book.objects.all()
    if len(title) > 0 :
        books = books.objects.filter(title__in = titles)
    ...
    authors = Authors.objects.filter(name__in=books)
    if len(authors_input) > 0 :
        authors  = authors.filter(name__in = authors_input)
    result = []
    for book in books:
        authors = authors.filter(name=book.author)
        for author in authors:
            output_item = {}
            output_item['book_name'] = book.title 
            output_item['isbn'] = book.isbn
            output_item['author'] = author.name
            result.append(output_item)
    return result

1 Ответ

1 голос
/ 08 февраля 2012

Поскольку это общий шаблон, существует общее представление , которое позаботится об этом. Фрагменты кода здесь взяты непосредственно из документации, модифицированной для вашего уникального случая.

urls.py:

from django.conf.urls.defaults import *
from django.views.generic import ListView
from myapp.models import Book

urlpatterns = patterns('',
    (r'^books/$', ListView.as_view(
        model=Book,
    )),
)

Создайте шаблон с именем book_list.html в каталоге с именем myapp где-нибудь в папке, которая находится в вашем TEMPLATE_DIRS.

Этот фрагмент в шаблоне (book_list.html) делает то, что вам нужно:

<ul>
{% for book in object_list %}
  {% for author in book.author_set.all %}
  <li>{{ book.title }}&mdash;{{ book.isbn }}&mdash;{{ author.name }}</li>
  {% endfor %}
{% endfor %}
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...