Аннотирование похожих тегов статей в Django Admin

Я хочу отображать количество похожих тегов в секции Tag администратора Django следующим образом:

name          |      posts
-------------------------------
business      |        3

В настоящее время в моей таблице Tag у меня есть что-то вроде этого. Это разные посты, которые имеют похожие теги.

name          |      post_id
-------------------------------
business      |        1
business      |        2
business      |        3

Мои модели

class Posts(models.Model):
    title = models.CharField(max_length=500, verbose_name='Post Title')

class Tags(models.Model):
    name = models.CharField(max_length=500)
    date_created = models.DateField(auto_now_add=True, verbose_name='Date Created')
    last_modified = models.DateField(auto_now=True, verbose_name='Last Modified')
    post = models.ForeignKey(Posts, on_delete=models.CASCADE, verbose_name='Posts')

У меня есть это в файле admin.py

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.annotate(post_count=Sum("post"))
        return queryset

admin.site.register(Tags, TagAdmin)

Вот как это выглядит в панели администратора

name          |    post_count
-------------------------------
business      |        3
business      |        3
business      |        3

Как мне добиться отображения только одного экземпляра названия тега со всеми постами, которые имеют этот тег, вместо повторения выше и вместо желаемого результата ниже?

name          |      posts
-------------------------------
business      |        3

В приведенном в вопросе коде создается несколько тегов с одним и тем же именем (в отличие от создания одного тега и привязки его к нескольким постам), следовательно, несколько записей в представлении администратора. Структура моделей может быть улучшена для достижения требуемой функциональности:

models.py

class Post(models.Model):
    title = models.CharField(max_length=500, verbose_name='Post Title')
    tags = models.ManyToManyField(Tag, related_name='posts', verbose_name='Tags')

class Tag(models.Model):
    name = models.CharField(max_length=500)
    date_created = models.DateField(auto_now_add=True, verbose_name='Date Created')
    last_modified = models.DateField(auto_now=True, verbose_name='Last Modified')

admin.py

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.posts.count()

admin.site.register(Tag, TagAdmin)
Вернуться на верх