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 enumerar los otros libros del autor. Eso significa ir del autor de vuelta a sus libros: una ForeignKey funciona en ambas direcciones. Si una Loan apunta a un libro, loan.book va hacia adelante, y Django añade un administrador a Book para el camino de vuelta, cuyo nombre se forma con el 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 ya no existe.
Las plantillas recorren las relaciones con puntos y llaman a los métodos sin paréntesis: {% for other in loan.book.loans.all %} avanza y después vuelve para obtener todos los préstamos del mismo libro. Un nombre mal escrito no muestra nada y no genera ningún error, así que, cuando una lista aparece vacía, comprueba primero los nombres.
Desafío
Fácil- Asigna a
Book.authorel nombre de acceso inversobooks. - En
book_detail.html, encima del enlace Volver, añade un<h2>comoMore by Frank Herberty un<ul class="more">que enumere todos los libros de ese autor, cada uno con un enlace a su página.
Pulsa Run y abre la página de un libro.
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