Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

270
Vistas
consultando clave externa anidada para loop django

Estoy tratando de devolver una lista de categorías para una empresa, y para cada categoría me gustaría enumerar todos los elementos relacionados con la categoría.

Estaba devolviendo todos mis artículos, no por categoría, pero he decidido que los quiero ordenados por categoría. Esto es lo que he intentado (entre otros intentos también) simplemente tengo problemas para colocar los elementos en sus categorías. Este es mi último intento

En mi models.py tengo

 Business(models.Model): name = models.CharField(max_length=100) address = models.CharField(max_length=100) logo = models.CharField(max_length=300) ItemCategory(models.Model): name = models.CharField(max_length=50) Item(models.Model): name = models.CharField(max_length=100) business = models.ForeignKey(Business) category = models.ForeignKey(ItemCategory) short_description = models.CharField(max_length=250)

en mis vistas.py

 def business_profile(request, business_id): items = Item.objects.filter(business_id = business_id).select_related('itemcategory') return render(request, 'business_profile.html', {"items": items})

en mi plantilla estoy intentando

 {% for itemcategory in items.itemcategory_set.all %} {{ itemcategory.name }} {% for item in itemcategory %} {{ item.name }} <br> {{ item.short_description }} {% endfor %} {% endfor %}

A partir de mi investigación sobre otras preguntas y la lectura de los documentos, sentí que esto sería correcto. Sin embargo, a partir de mis resultados, no puedo obtener el resultado correcto en mi plantilla.

  1. ¿Sería esta la práctica correcta? ¿O debería intentar obtener las categorías primero con

categories = ItemCategory.objects.filter(business = business_id)

y luego posiblemente agregar un select_related('item') para procesar todos los elementos de la categoría?

  1. Cuando me refiero a los datos en la plantilla pero mi modelo tiene 2 palabras (ItemCategory), por ejemplo, cuando retrocedo en busca de una clave externa o uso el modelo en select_related(''), ¿usaría item_category o simplemente usaría itemcategory con sin guión bajo?

ACTUALIZACIÓN: respondí a continuación en un comentario con una explicación.

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Para enumerar los artículos por categoría, usé la idea de @yusuf.oguntola e inicialmente obtuve el negocio con .get(), luego creé un conjunto de consultas para obtener todos los artículos. Mi función en views.py incluida

 business = Business.objects.get(id = business_id) items = business.item_set.all().order_by('category')

nota: el business_id se pasó en el patrón de URL

Sin embargo, el cambio clave estuvo en mi plantilla. Encontré esta increíble funcionalidad integrada para plantillas en los documentos de django aquí

Lo implementé en la plantilla así...

 {% regroup items by category as category_list %} <ul> {% for category in category_list %} <li>{{ category.grouper }} <ul> {% for item in category.list %} <li>{{ item.name }}<br> {{ item.short_description }}</li> {% endfor %} </ul> </li> {% endfor %} </ul>

Una de las partes más importantes es que debe tener order_by() y poner el parámetro del campo por el que está ordenando, en mi caso, categoría. Si esto no está incluido, simplemente colocará los elementos enumerados en orden cronológico y repetirá su instancia de campo.

about 4 years ago · Santiago Trujillo Denunciar

0

  1. items = Item.objects.filter(business_id = business_id) es incorrecto. Más bien deberías decir:

    items = Item.objects.filter(business__id = business_id) #Observe el guion bajo doble.

También puede preferir obtener el negocio y simplemente decir:

 business.item_set.all() #This would retrieve all Item for the business.
  1. select_related() espera un nombre de campo como parámetro. Por lo tanto, use un nombre de campo que exista en el modelo de artículo. Me gusta:

    select_related('category')

  2. ¿Dónde está la comida? Sin embargo, puede ser que pueda continuar desde allí.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda