强制 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,但这是我通过阅读文档中的教程整理出来的