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

2024-04-23 23:56:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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来填充一个球队的特定比赛日程表。因此,我进行以下查询:

^{pr2}$

这给了我球队的比赛。我的问题是当我在视图.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”不是团队模型的ForeignKey引用,所以我不能使用对象的str表示。我可以通过将QuerySet转换为pandas数据帧,然后返回一个字典(很容易读入django-tables2)。但是我总是喜欢将QuerySet返回到django表,而不是dict,我想知道是否有任何方法可以覆盖F()的行为,或者是否有其他方法可以使用QuerySets来实现这一点。在


Tags: django方法py模型selfgamehomemodels
1条回答
网友
1楼 · 发布于 2024-04-23 23:56:55

既然您说过使用django-tables2,那么我假设您有一个table类

# 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,但这是我通过阅读文档中的教程而得到的

相关问题 更多 >