强制F()表达式返回模型实例而不是主键

时间:2018-03-28 16:09:40

标签: python django django-tables2

enter image description here

在文档中,有没有办法覆盖这种行为?

即。我希望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执行此操作。

1 个答案:

答案 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,但这是我通过阅读文档中的教程而放在一起的