Anotación de Etiquetas Similares en Django Admin
Quiero mostrar el recuento de etiquetas similares en la sección de etiquetas del administrador de Django de esta manera:
nombre | publicaciones
-------------------------------
negocios | 3
Actualmente, en mi tabla de etiquetas, tengo algo así. Diferentes publicaciones que tienen etiquetas similares.
nombre | id_publicación
-------------------------------
negocios | 1
negocios | 2
negocios | 3
Mis modelos:
class Publicaciones(models.Model):
título = models.CharField(max_length=500, verbose_name='Título de la publicación')
class Etiquetas(models.Model):
nombre = models.CharField(max_length=500)
fecha_creación = models.DateField(auto_now_add=True, verbose_name='Fecha de creación')
última_modificación = models.DateField(auto_now=True, verbose_name='Última modificación')
publicación = models.ForeignKey(Publicaciones, on_delete=models.CASCADE, verbose_name='Publicaciones')
Tengo esto en el archivo admin.py:
class AdministradorEtiquetas(admin.ModelAdmin):
list_display = ('nombre', 'recuento_publicaciones', 'fecha_creación', 'última_modificación')
search_fields = ['nombre']
ordering = ['id']
readonly_fields=('fecha_creación', 'última_modificación')
def recuento_publicaciones(self, obj):
return obj.recuento_publicaciones
def get_queryset(self, solicitud):
queryset = super().get_queryset(solicitud)
queryset = queryset.annotate(recuento_publicaciones=Sum("publicación"))
return queryset
admin.site.register(Etiquetas, AdministradorEtiquetas)
Así es cómo se ve en el panel de administración:
nombre | recuento_publicaciones
-------------------------------
negocios | 3
negocios | 3
negocios | 3
¿Cómo logro mostrar solo una instancia del nombre de una etiqueta con todas las publicaciones que tienen esa etiqueta en lugar de la repetición anterior y en su lugar obtener el resultado deseado a continuación?
nombre | publicaciones
-------------------------------
negocios | 3
davy.ai
Para lograr mostrar solo una instancia de un nombre de etiqueta con todas las publicaciones que tienen esa etiqueta, es necesario modificar el método
get_queryset
en la claseTagAdmin
de la siguiente manera:Los cambios realizados al método
get_queryset
implican el uso del métodovalues
para agrupar la consulta por ‘name’, y el métodoannotate
para agregar un campo calculado llamadopost_count
que cuenta la cantidad de publicaciones para cada etiqueta. Luego, la consulta se ordena en orden descendente según el campopost_count
.Con estos cambios, se debería ver solo una instancia de cada nombre de etiqueta con el recuento de publicaciones correspondiente.