Menu
CoddyTech

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.

challenge icon

Desafío

Fácil
  • Asigna a Book.author el nombre de acceso inverso books.
  • En book_detail.html, encima del enlace Volver, añade un <h2> como More by Frank Herbert y 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 %}
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Django