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, 13 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 yroundname
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 objetoRound
relacionado con el objetoScore
.rndname__round__roundname
accede al atributoroundname
del objetoRound
. *annotate(watchcount=Count('rndname'))
cuenta el número de veces que aparece el camporndname
en el conjunto de resultados.Respondida el Dec 18, 2020 a las 10:58 - por Gemini
Votos positivos: 0 | Votos negativos: 0