强制 F() 表达式 return 模型实例而不是主键
Force F() expression to return a model instance rather than a primary key
在文档中,是否有覆盖此行为的方法?
即我想要 car.built_by
到 return 模型实例,即 <Manufacturer: Toyota>
而不是主键,因为我需要在注释时维护外键关系。
更新:
我目前正在开发一个篮球统计网站。我有以下型号:
# models.py
class Game(models.Model):
league = models.ForeignKey('League', ...)
tournament = models.ForeignKey('Tournament', ...)
home_team = models.ForeignKey('Team',...)
away_team = models.ForeignKey('Team',...)
home_pts = models.IntegerField()
away_pts = models.IntegerField()
class Team(models.Model):
team_name = models.CharField()
team_code = models.CharField()
team_nickname = models.CharField()
def __str__(self):
return f'{self.team_name} {self.team_nickname}'
我正在使用 django-tables2 填充特定锦标赛的团队日程表 table。所以我做了以下查询:
Game.objects.filter(tournament_id=/insert_tournament_id_here/).filter(Q(home_team_id=self.id) | Q(away_team_id=self.id))
这给了我团队运动会。我的问题是,当我填充团队日程表的 views.py 时,我希望它是 "Opponent" 而不是 "Home Team" 和 "Away Team"。所以我决定这样做:
Team_Game_Queryset.annotate(opponent=Case(When(home_team=/team_id/, then=F('away_team')), default=F('home_team'), output_field=ForeignKey('myapp.Team'))
我的问题是,带注释的列 "opponent" 不是 Team 模型的 ForeignKey 引用,所以我不能使用对象的 str 表示。我能够通过将 QuerySet 转换为 pandas DataFrame 然后 returning 字典(这很容易读入 django-tables2)来做到这一点。但我总是更喜欢 return QuerySet to django-tables 而不是 dict,我想知道是否有任何方法可以覆盖 F() 行为,或者是否有任何其他方法可以使用 QuerySets 执行此操作。
既然你说你正在使用 django-tables2,我假设你有一个 table class
# tables.py
import django_tables2 as tables
class Game Table(tables.Table):
opponent = tables.Column()
class Meta:
model = Game
def __init__(self, team_id, *args, **kwargs):
super().__init__(*args, **kwargs)
def render_opponent(self, record):
return record.home_team if record.away_team_id == self.team_id else record.away_team
# views.py
def list_team_games(request):
query_set = Game.objects.filter(tournament_id=/insert_tournament_id_here/).filter(Q(home_team_id=self.id) | Q(away_team_id=self.id))
table = GameTable(self.id, queryset)
return render(request, 'game_list.html', {
'table': table
})
请注意,我添加了一个 opponent
列并在 table 上编写了一个 render_opponent
方法。 (Refer to the docs)
我个人从未使用过django-tables2,但这是我通过阅读文档中的教程整理出来的
在文档中,是否有覆盖此行为的方法?
即我想要 car.built_by
到 return 模型实例,即 <Manufacturer: Toyota>
而不是主键,因为我需要在注释时维护外键关系。
更新:
我目前正在开发一个篮球统计网站。我有以下型号:
# models.py
class Game(models.Model):
league = models.ForeignKey('League', ...)
tournament = models.ForeignKey('Tournament', ...)
home_team = models.ForeignKey('Team',...)
away_team = models.ForeignKey('Team',...)
home_pts = models.IntegerField()
away_pts = models.IntegerField()
class Team(models.Model):
team_name = models.CharField()
team_code = models.CharField()
team_nickname = models.CharField()
def __str__(self):
return f'{self.team_name} {self.team_nickname}'
我正在使用 django-tables2 填充特定锦标赛的团队日程表 table。所以我做了以下查询:
Game.objects.filter(tournament_id=/insert_tournament_id_here/).filter(Q(home_team_id=self.id) | Q(away_team_id=self.id))
这给了我团队运动会。我的问题是,当我填充团队日程表的 views.py 时,我希望它是 "Opponent" 而不是 "Home Team" 和 "Away Team"。所以我决定这样做:
Team_Game_Queryset.annotate(opponent=Case(When(home_team=/team_id/, then=F('away_team')), default=F('home_team'), output_field=ForeignKey('myapp.Team'))
我的问题是,带注释的列 "opponent" 不是 Team 模型的 ForeignKey 引用,所以我不能使用对象的 str 表示。我能够通过将 QuerySet 转换为 pandas DataFrame 然后 returning 字典(这很容易读入 django-tables2)来做到这一点。但我总是更喜欢 return QuerySet to django-tables 而不是 dict,我想知道是否有任何方法可以覆盖 F() 行为,或者是否有任何其他方法可以使用 QuerySets 执行此操作。
既然你说你正在使用 django-tables2,我假设你有一个 table class
# tables.py
import django_tables2 as tables
class Game Table(tables.Table):
opponent = tables.Column()
class Meta:
model = Game
def __init__(self, team_id, *args, **kwargs):
super().__init__(*args, **kwargs)
def render_opponent(self, record):
return record.home_team if record.away_team_id == self.team_id else record.away_team
# views.py
def list_team_games(request):
query_set = Game.objects.filter(tournament_id=/insert_tournament_id_here/).filter(Q(home_team_id=self.id) | Q(away_team_id=self.id))
table = GameTable(self.id, queryset)
return render(request, 'game_list.html', {
'table': table
})
请注意,我添加了一个 opponent
列并在 table 上编写了一个 render_opponent
方法。 (Refer to the docs)
我个人从未使用过django-tables2,但这是我通过阅读文档中的教程整理出来的