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 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.

challenge icon

Desafío

Fácil

Enumera los otros libros del autor en la página de cada libro.

  1. En books/models.py, asigna a Book.author el nombre relacionado books, para que author.books.all() devuelva todos los libros de ese autor.
  2. En book_detail.html, encima del enlace para 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 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 %}
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