使用多对多关系将字段值检索到 Django Admin

Retrieve field values to Django Admin using many to many relationships

我有一个简单的任务:我需要在游戏列表(Django 管理员)中公开与游戏相关的玩家名称。 Game 对象通过 'players' 属性与 Player 对象具有 ManyToMany 关系。问题是现在我有空的 '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(self):
        return self.players.all()

或者,如果您只需要玩家姓名或其他任何内容,您可以将其更改(或添加其他方法)为类似的内容:

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

这叫做list comprehension,如果你不熟悉的话。