Получение значений полей в 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()]
Это называется понимание списка, если вы с ним не знакомы.