django: related_name del campo ForeignKey relacionado consigo mismo no funciona | obtener dirección opuesta de la referencia a sí mismo en la plantilla
¡Hola! 🙂
Tengo un modelo para crear instituciones individuales (Institution
) y puedo conectarlo a una institución padre a través de parent_institution
(self).
Entonces, tengo la institución A, que es padre de b, c, d (todas ellas instituciones individuales con su propia vista de detalles). En la vista de detalles de b, tengo la sección ‘institución padre’ donde obtengo A como resultado, incluyendo un enlace a la vista de detalles de A.
<p><b>Institución padre: </b>
{% if institution.parent_institution %}
<a href="{% url 'stakeholders:institution_detail' institution.parent_institution.id %}">
{{institution.parent_institution}}
</a>
{% endif %}
</p>
Siguiendo este enlace llego a la vista de detalles de A donde quiero una sección con las instituciones hijas. Deberían aparecer b, c, d.
He añadido un nombre relacionado a la parent_institution
.
class Institution(models.Model):
name = models.CharField(
verbose_name=("Nombre de la institución"),
max_length=200,
)
parent_institution = models.ForeignKey(
"self",
verbose_name=("Institución padre"),
on_delete=models.SET_NULL,
blank=True,
null=True,
help_text=_("si corresponde"),
related_name="child",
)
Normalmente puedo seguir la clave externa en la dirección opuesta a través de este nombre relacionado.
<p><b>Institución hija: </b>
{{institution.child.name}}
</p>
Pero en este caso no está funcionando y me da ‘None’. Por lo tanto, intenté lo siguiente:
{% if institution.id == institution.all.parent_institution.id %}
{{institution.name}}
{% endif %}
{% if institution.all.id == institution.parent_institution.id %}
{{institution.name}}
{% endif %}
{% for child in institutions.all %}
{% if child.id == institution.parent_institution.id %}
{{institution.name}}
{% endif %}
{% endfor %}
En views.py:
class InstitutionDetail (DetailView):
model = Institution
def get(self, request, *args, **kwargs):
institutions_child = Institution.objects.filter(parent_institution__isnull=True).prefetch_related ('parent_institution_set')
institutions = get_object_or_404(Institution, pk=kwargs['pk'])
context = {'institutions_child': institutions_child, 'institutions': institutions}
return render(request, 'stakeholders/institution_detail.html', context)
{% for child_node in institutions.parent_institution_set.all %}
{{child_node.name}}
{% endfor %}
En cualquier caso, obtengo ‘None’ o el nombre de las instituciones actuales (A).
¿Alguien sabe cómo podría lograr el objetivo de obtener todas las instituciones hijas en la vista de detalles?
¡Cualquier ayuda es apreciada! 🙂
davy.ai
Para obtener todas las instituciones hijas en la vista detallada de la institución principal, puede utilizar el nombre relacionado que agregó al campo
parent_institution
en el modeloInstitution
.En su plantilla de vista detallada para la institución principal, puede recorrer el atributo
parent_institution_set
del objeto de institución actual para obtener todas las instituciones hijas:Asegúrese de utilizar
institution.parent_institution_set.all
en lugar deinstitutions.parent_institution_set.all
porqueinstitution
es el nombre de variable que pasó al contexto de la plantilla, noinstitutions
.