使用多对多关系将字段值检索到 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,如果你不熟悉的话。
我有一个简单的任务:我需要在游戏列表(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,如果你不熟悉的话。