在文档中,有没有办法覆盖这种行为?
即。我希望car.built_by
返回一个模型实例,即<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来填充团队特定锦标赛时间表的表格。所以我做了以下查询:
Game.objects.filter(tournament_id=/insert_tournament_id_here/).filter(Q(home_team_id=self.id) | Q(away_team_id=self.id))
给了我团队的游戏。我的问题是,当我填充团队日程表的views.py时,我希望它是“对手”而不是“主队”和“客队”。所以我决定这样做:
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然后返回一个字典(这是一个简单的读入django-tables2)来做到这一点。但我总是更喜欢将QuerySet返回到django-tables而不是dict,我想知道是否有任何方法可以覆盖F()行为,或者是否有任何其他方法可以使用QuerySets执行此操作。
答案 0 :(得分:0)
由于您已经说过您正在使用django-tables2,我假设您有一个表类
# 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
列并编写了render_opponent
方法。 (Refer to the docs)
我个人从未使用过django-tables2,但这是我通过阅读文档中的教程而放在一起的