# admin.py from django.contrib import admin from django.db.models import Avg, Count from .models import Musician, Genre, Album, Song, Meloman, Rating, Preference # Сначала зарегистрируйте модели, используемые в autocomplete_fields @admin.register(Genre) class GenreAdmin(admin.ModelAdmin): list_display = ('genre_name',) search_fields = ('genre_name',) # Важно для autocomplete! @admin.register(Album) class AlbumAdmin(admin.ModelAdmin): list_display = ('album_name', 'musician') search_fields = ('album_name', 'musician__name') # Важно для autocomplete! list_select_related = ('musician',) @admin.register(Musician) class MusicianAdmin(admin.ModelAdmin): list_display = ('name', 'city', 'birth_year') search_fields = ('name', 'city') @admin.register(Song) class SongAdmin(admin.ModelAdmin): list_display = ('title', 'album', 'genre', 'duration_formatted', 'avg_rating') list_filter = ('genre', 'album__musician') search_fields = ('title',) autocomplete_fields = ['album', 'genre'] # Теперь работает, т.к. админы зарегистрированы def get_queryset(self, request): return super().get_queryset(request).annotate( avg_rating_value=Avg('rating__score') ) def avg_rating(self, obj): if hasattr(obj, 'avg_rating_value') and obj.avg_rating_value: return f"{obj.avg_rating_value:.1f} ★" return "Нет оценок" avg_rating.short_description = "Средний рейтинг" def duration_formatted(self, obj): return obj.duration_formatted if obj.duration_sec else "00:00" duration_formatted.short_description = "Длительность" @admin.register(Meloman) class MelomanAdmin(admin.ModelAdmin): list_display = ('full_name', 'gender', 'city', 'age') search_fields = ('full_name', 'city') list_filter = ('gender', 'city') def age(self, obj): return obj.age if obj.age else "—" age.short_description = "Возраст" @admin.register(Rating) class RatingAdmin(admin.ModelAdmin): list_display = ('song', 'meloman', 'score', 'rating_date') list_filter = ('score', 'rating_date') search_fields = ('song__title', 'meloman__full_name') autocomplete_fields = ['song', 'meloman'] list_select_related = ('song', 'meloman') @admin.register(Preference) class PreferenceAdmin(admin.ModelAdmin): list_display = ('meloman', 'genre') list_filter = ('genre',) search_fields = ('meloman__full_name', 'genre__genre_name') autocomplete_fields = ['meloman', 'genre']