Nombres relacionados
Parte de la sección Modelos y el panel de administración del Journey de Django de Coddy. Lección 17 de 23.
La página de un libro podría mostrar otros libros del autor. Eso significa ir del autor a sus libros: una ForeignKey funciona en ambas direcciones. Si un Loan apunta a un libro, loan.book va hacia adelante, y Django añade un gestor a Book para la dirección inversa, cuyo nombre se forma con el nombre del modelo más _set: book.loan_set.all(). related_name le da un nombre mejor:
book = models.ForeignKey(Book, on_delete=models.PROTECT, related_name="loans")Ahora book.loans.all() devuelve los préstamos de ese libro, book.loans.count() funciona igual que con Loan.objects, y loan_set deja de existir.
Las plantillas siguen las relaciones con puntos y llaman a los métodos sin paréntesis: En la página de un libro, {% for loan in book.loans.all %} muestra los préstamos de ese libro. Si escribes mal un nombre, no aparece nada y no se muestra ningún error, así que, cuando una lista aparece vacía, comprueba primero los nombres.
Desafío
FácilEnumera los otros libros del autor en la página de cada libro.
- En
books/models.py, asigna aBook.authorel nombre relacionadobooks, para queauthor.books.all()devuelva todos los libros de ese autor. - En
book_detail.html, encima del enlace para volver, añade un<h2>comoMore by Frank Herberty un<ul class="more">que enumere todos los libros de ese autor, cada uno como enlace a su página.
Pulsa «Jugar» y haz clic en Dune: debajo de «Más obras de Frank Herbert» verás Children of Dune y Dune.
Pruébalo tú mismo
{% extends "books/base.html" %}
{% block title %}{{ book.title }}{% endblock %}
{% block content %}
<h1>{{ book.title }}</h1>
<p class="author">by {{ book.author }}</p>
<ul>
<li>Published in {{ book.year }}</li>
<li>Genre: {{ book.get_genre_display }}</li>
<li>Price: {{ book.price }}</li>
</ul>
<p><a href="{% url 'books:home' %}">Back to the shelf</a></p>
{% endblock %}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Modelos y el panel de administración
3Páginas desde la base de datos
Una lista desde la base de datosUna página para cada libroPractica por tu cuenta: Playground de Django