Получение значений полей в Django Admin с помощью отношений "многие ко многим

У меня простая задача: мне нужно отобразить имя игрока, связанного с игрой, в списке игр (Django Admin). Объект Game имеет отношение ManyToMany с объектом Player через атрибут 'players'. Проблема в том, что сейчас у меня пустое поле 'players_list' (пустой список означает, что я не знаю, что делать и просто оставляю его здесь[введите описание изображения здесь][1]), хотя я пробовал Player.objects.all() и, очевидно, получил всех игроков, даже тех, кто не привязан к конкретной игре. Мне кажется, что решение простое, но мой мозг отказывается работать после 55 открытых вкладок. Заранее спасибо! Это мой models.py

from django.db import model 
class Player(models.Model):
    name = models.CharField(max_length=54, default="")
    email = models.EmailField(max_length=54)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    def __str__(self):
        return self.name

class Game(models.Model):
    name = models.CharField(max_length=254, default="")
    players = models.ManyToManyField(Player, blank=True, related_name='player_games')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    players_list = []
    def __str__(self):
        return self.name

и admin.py

from django.contrib import admin
from .models import Game, Player


class PlayerInline(admin.TabularInline):
    model = Game.players.through

@admin.register(Player)
class Admin(admin.ModelAdmin):

    search_fields = ['name', 'email']
    list_display = ('name', 'email', 'created_at', 'updated_at')
    inlines = [
    PlayerInline,
]

@admin.register(Game)
class AdminAdmin(admin.ModelAdmin):
    list_display = ('name',  'created_at', 'updated_at', 'players_list')
    inlines = [
    PlayerInline,
]
    exclude = ('players',)

Фото, как это выглядит сейчас [1]: https://i.stack.imgur.com/KVJ5y.png

Лучшим подходом здесь будет создание пользовательского метода в вашей модели вместо одной переменной. Вам даже не придется изменять ваш list_display:

class Game(models.Model):
    ...
    def players_list:
        return self.players.all()

Альтернативно, если вам нужны только имена игроков или что-то еще, вы можете изменить его (или добавить другой метод) на что-то вроде этого:

class Game(models.Model):
    ...
    def players_list:
        return [player for player in self.players.all()]
        # or
        return [player.name for player in self.players.all()]

Это называется понимание списка, если вы с ним не знакомы.

Вернуться на верх