es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , , ,

Answer

  1. Avatar for 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 clase TagAdmin de la siguiente manera:

    from django.db.models import Count
    
    class TagAdmin(admin.ModelAdmin):
        list_display = ('name', 'post_count', 'date_created', 'last_modified')
        search_fields = ['name']
        ordering = ['id']
        readonly_fields=('date_created', 'last_modified')
    
        def post_count(self, obj):
            return obj.post_count
    
        def get_queryset(self, request):
            queryset = super().get_queryset(request)
            queryset = queryset.values('name').annotate(post_count=Count('post')).order_by('-post_count')
            return queryset
    

    Los cambios realizados al método get_queryset implican el uso del método values para agrupar la consulta por ‘name’, y el método annotate para agregar un campo calculado llamado post_count que cuenta la cantidad de publicaciones para cada etiqueta. Luego, la consulta se ordena en orden descendente según el campo post_count.

    Con estos cambios, se debería ver solo una instancia de cada nombre de etiqueta con el recuento de publicaciones correspondiente.

Comments are closed.