Django Template Tag - Получить подсчет из связанных моделей

Здравствуйте! Я перечисляю в html список регистров (RegAcceso) и хочу включить в каждый из них количество регистров (Registros), связанных с ним через внешний ключ.

  • Модели
class RegAcceso(models.Model):
    reg_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    fecha = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.id} - {self.reg_user} - {self.fecha.strftime("%d/%m/%Y")}'

    class Meta:
        ordering = ['-fecha']


class Registro(models.Model):
    id_reg = models.ForeignKey(RegAcceso, on_delete=models.CASCADE)
    cuil = models.BigIntegerField()
    deduccion = models.CharField(max_length=50)
    tipo = models.CharField(max_length=50)
    dato1 = models.CharField(max_length=50)
    dato2 = models.CharField(max_length=50, blank=True, null=True)
    porc = models.CharField(max_length=3, blank=True, null=True)

    def __str__(self) -> str:
        return f'{self.id_reg.reg_user} - {self.id_reg.fecha.strftime("%d/%m/%Y")} - {self.cuil}'
  • Виды
@login_required
def siradig_view(request):
    listado = {}
    query_historia = RegAcceso.objects.filter(reg_user=request.user)

    if request.method == 'POST' and request.FILES.get('upload'):
        # TODO: Validar form
        listado = lista_zip(request.FILES['upload'])
        dire = lista_zip_ex(request.FILES['upload'])
        archivo_path = os.path.join(settings.TEMP_ROOT, 'ultima_carpeta.txt')
        with open(archivo_path, 'w') as f:
            f.write(dire)

    else:
        # Borro los archivos en carpeta temporal
        clean_folder(settings.TEMP_ROOT)

    my_context = {
        'listado': listado,
        'query_historia': query_historia,
    }

    return render(request, 'reader/home.html', my_context)
  • Шаблон
{% if query_historia %}
  <div class="card" style="width: 80%;">
    <ul class="list-group list-group-flush">
      {% for registro in query_historia %}
        <li class="list-group-item text-center">
          <a href="{% url 'historico' registro.id %}">{{ registro.fecha|date:"d/m/Y h:i a" }}{{ registro.count }}</a>
        </li>
      {% endfor %}
    </ul>
  </div>
{% endif %}

Я застрял на части {{ registro.count }}. Заранее спасибо!

Что я бы предложил, так это добавить related name к полю Registro model FK. Например:

class Registro(models.Model):
     id_reg = models.ForeignKey(RegAcceso, on_delete=models.CASCADE, related_name='registers')  # related_name='some name of your choice'

Затем внутри for loop в вашем template, вы можете подсчитать все Registro объекты, связанные с каждым RegAcceso объектом путем ссылки на related_name.

{% for registro in query_historia %}
     <li class="list-group-item text-center">
          <a href="{% url 'historico' registro.id %}">{{ registro.fecha|date:"d/m/Y h:i a" }}{{ registro.registers.count }}</a>
     </li>
{% endfor %}

Это должно сработать.

Вернуться на верх