Отношения ManyToManyField не получают данных - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть одна структура, подобная этой: 1. Автор 2. Книга 3. AuthorType 4. AuthorBookType

Книга может иметь более одного автора и может иметь такие функции внутри книги, как: «Автор"," Соавтор "," Часть "," Помощник "и т. Д .:

class Book(models.Model):
    title=models.CharField(max_length=100)


class Author(models.Model):
    name=models.CharField(max_length=100)
    books=models.ManyToManyField(Book, through='AuthorBookType')


class AuthorType(models.Model):
    description=models.CharField(max_length=100)


class AuthorBookType(models.Model):
    author=models.ForeignKey(Author, on_delete=models.CASCADE)
    book=models.ForeignKey(Book, on_delete=models.CASCADE)
    author_type=models.ForeignKey(AuthorType, on_delete=models.CASCADE)

Моя база данных должна выглядеть так:

AUTHOR:
__________________________
| ID | NAME              |
|========================|
| 1  | Jhon Doe.         |
| 2  | Charles Albert    |
| 3  | Matt Greg         |
| 4  | Anne Engel        |
--------------------------

BOOK:
__________________________
| ID | NAME              |
|========================|
| 1  | Paradise City     |
| 2  | Profaned Apple    |
--------------------------

AUTHOR_TYPE:
__________________________
| ID | DESCRIPTION       |
|========================|
| 1  | Author            |
| 2  | Co-Author         |
--------------------------

AUTHOR_BOOK_TYPE:
_____________________________________________
| ID | AUTHOR_ID | BOOK_ID | AUTHOR_TYPE_ID |
|===========================================|
| 1  | 1         | 1       | 1              |
| 2  | 2         | 1       | 2              |
| 3  | 3         | 1       | 2              |
| 4  | 3         | 2       | 1              |
| 5  | 4         | 2       | 2              |
---------------------------------------------

На моем views.py я сделал:

class AuthorsListView(ListView)
    model = Author
    context_object_name = 'authors'
    template_name = 'core/authors_list.html'

Тогда в моем шаблоне просто:

{% for author in authors %}
    {{ author.name }}<br>
    {{ author.books }}
{% endfor %}

Возвращение было:

<author name>
<core.Books.None>

Я что-то не так сделал?Я искал подобные примеры, но я нашел несколько старых примеров с Django 1.x, ни одного для 2.x.

В документации я не нашел подобных примеров (только без таблицы соединений).https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Здесь нет разницы в синтаксисе между версиями Django;любой из найденных вами документов все равно будет работать.

Вам нужно перебрать отношение «многие ко многим»:

{% for author in authors %}
    {{ author.name }}<br>
    {% for book in author.books.all %}{{ book.title }}{% endfor %}
{% endfor %}
0 голосов
/ 09 декабря 2018

Может быть, более ясное решение.

from .models import Author
class AuthorsListView(ListView)
    model = Author
    context_object_name = 'authors'
    template_name = 'core/authors_list.html'
    def get_queryset(self):
        return Author.objects.all()
...