Django: Regresar datos de una tabla vinculada

Estoy haciendo un proyecto que gira alrededor de almacenar puntuaciones contra jugadores. Cada jugador puede disparar varias rondas, algunas veces. Estoy tratando de hacer una página que muestra una lista de las rondas disparadas y el número de veces que la ronda ha sido disparada. Esto será finalmente un enlace a una tabla de esas rondas. He sido capaz de traer la id redonda pero no puedo recuperar el nombre redondo de la mesa enlazada. Esto parece algo tan básico pero no puedo entenderlo.

Mis modelos son:

class Score(models.Model):

BOW_TYPE = (
    ('R', 'Recurve',),
    ('C', 'Compound',),
    ('L', 'Longbow',),
)
archer = models.ForeignKey('User', related_name='scores', on_delete=models.CASCADE)
rndname = models.ForeignKey('Round', related_name='rounds', verbose_name=("Round Name"), on_delete=models.CASCADE)
age = models.ForeignKey('Age', related_name='scores', on_delete=models.CASCADE)
bowtype = models.CharField(max_length=1, verbose_name=("Bow Type"), choices=BOW_TYPE)
score = models.IntegerField(default=0)
dateshot = models.DateField(verbose_name="Date Round Shot", default=timezone.now)
created_date = models.DateTimeField(default=timezone.now)

def __str__(self):
    return str(self.archer) + ' | ' + str(self.score) + ' | ' + str(self.rndname) + ' | ' + str(self.created_date)

clase Round(models.Model):

roundname = models.CharField(max_length=200)
maxscore = models.IntegerField(default=0)

def __str__(self):
    return str(self.roundname)

Puedo devolver el número id de las distintas rondas usando esta línea en vistas. Py:

posts = Score.objects.values('rndname').distinct().order_by('rndname')

y esto devuelve el id redondo como almacenado en la tabla de partituras, pero me gustaría el nombre de la ronda en lugar de su número id.

He utilizado este código en el archivo html:

{% for post in posts %}
      
  • Round Name: {{ post.rndname__round.roundname }} {{ watchcount }}
  • {% endfor %}

    y muchas variaciones de ellas.

    Siento que esto es muy simple pero no puedo sacarlo. ¿Alguien tiene alguna idea de dónde voy mal?

    Gracias.

    Pregunta hecha hace 3 años, 4 meses, 7 días - Por syntaxsorcerer


    2 Respuestas:

    • El problema que estás experimentando es que estás tratando de acceder al nombre de la ronda desde el objeto de Score usando la relación de clave externa, pero no lo estás haciendo de la manera correcta en tu plantilla.

      Puedes acceder al nombre de la ronda desde el objeto Score utilizando la siguiente sintaxis en tu plantilla:

      html
      {% for post in posts %}
          
    • Round Name: {{ post.rndname.roundname }}
    • {% endfor %}

      En este código, post.rndname representa el objeto Round vinculado a la puntuación y roundname es el campo del modelo Round que contiene el nombre de la ronda.

      Con esa corrección, deberías poder mostrar correctamente el nombre de la ronda en lugar de su ID en tu plantilla. ¡Espero que esta solución te sea útil!

      Respondida el Dec 18, 2020 a las 10:49 - por Gpt

      Votos positivos: 0 | Votos negativos: 0

    • Para recuperar el nombre de la ronda de la tabla vinculada, debes utilizar el método values() junto con la doble barra baja (__) para acceder a los atributos de los modelos relacionados. Aquí tienes el código actualizado:

      Vistas.py:

      python
      from django.db.models import Count
      
      posts = Score.objects.values('rndname__round__roundname').annotate(watchcount=Count('rndname')).distinct().order_by('rndname__round__roundname')
      

      HTML:

      html
      {% for post in posts %}
          
    • Round Name: {{ post.rndname__round__roundname }} {{ post.watchcount }}
    • {% endfor %}

      Esta modificación utilizará el método annotate() para contar el número de veces que se ha disparado cada ronda y luego ordenará los resultados por el nombre de la ronda.

      Explicación:

      rndname__round accede al objeto Round relacionado con el objeto Score. rndname__round__roundname accede al atributo roundname del objeto Round. * annotate(watchcount=Count('rndname')) cuenta el número de veces que aparece el campo rndname en el conjunto de resultados.

      Respondida el Dec 18, 2020 a las 10:58 - por Gemini

      Votos positivos: 0 | Votos negativos: 0