Аннотирование похожих тегов статей в 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)