【问题标题】:rewrite sql query using Django db Api使用 Django db Api 重写 sql 查询
【发布时间】:2014-07-29 09:38:33
【问题描述】:

这些是我在 django 中的模型

class Match(models.Model):
    team_a = models.ForeignKey("Team", related_name="team_a")
    equipo_b = models.ForeignKey("Team", related_name="team_b")
    goals_team_a = models.IntegerField(default=0)
    goals_team_b = models.IntegerField(default=0)
    winner_team = models.ForeignKey("Team", related_name="winner_team", null=True)
    match_type = models.CharField(choices=match_type_choices, max_length=100, null=False)
    match_played = models.BooleanField(default=False)
    date = models.DateField()

class Team(models.Model):
    name = models.CharField(max_length=200)
    group = models.CharField(choices=group_choices, max_length=1, null=False)
    matches_played = models.IntegerField(default=0)
    matches_won = models.IntegerField(default=0)
    matches_lost = models.IntegerField(default=0)
    matches_tied = models.IntegerField(default=0)
    goals_in_favor = models.IntegerField(default=0)
    goals_agaiinst = models.IntegerField(default=0)
    points = models.IntegerField(default=0)
    url_flag = models.CharField(max_length=500)

我在原始 sql 中有以下句子:

select 
  (select sum(goals_team_a) from match where team_a_id=9) +
  (select sum(goals_team_b) from match where team_b_id=9) goals_in_favor,
  (select sum(goals_team_b) from match where team_a_id=9) +
  (select sum(goals_team_a) from match where team_b_id=9) goles_against
;

我正在寻找一种使用 Django QuerySet API 重写此查询的有效方法,但甚至找不到方法,我知道我必须使用 annotate() 函数,但不要不知道怎么做。

【问题讨论】:

    标签: python sql django django-models django-database


    【解决方案1】:

    终于想出一个解决方案:

    def count_goals_in_favor(team):
        goals_home = Partido.objects.filter(team_a=team).extra(
            select={"total_goals": "SUM(goals_team_a)"}).values("total_goals")
        goals_away = Partido.objects.filter(team_b=team).extra(
            select={"total_goals": "SUM(goals_team_b)"}).values("total_goals")
       return goals_home[0]['total_goals'] + goals_away[0]['total_goals']
    
    
    def count_goals_against(team):
        goals_home = Partido.objects.filter(team_a=team).extra(
            select={"total_goals": "SUM(goals_team_b)"}).values("total_goals")
        goals_away = Partido.objects.filter(team_b=team).extra(
            select={"total_goals": "SUM(goals_team_a)"}).values("total_goals")
        return goals_home[0]['total_goals'] + goals_away[0]['total_goals']
    
    class Team(models.Model):
        pass # All the code I put in my question
        def goals_difference(self):
            return self.goals_in_favor - self.goals_against
    
    class Match(models.Model):
        pass # all the code i put in my question
        def save(self):
            self.team_a.goals_in_favor = count_ goals_in_favor(self.team_a)
            self.team_a.goals_against = count_goals_against(self.team_a)
    

    【讨论】:

      猜你喜欢
      • 2018-12-17
      • 2020-10-08
      • 2016-10-20
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2010-11-23
      相关资源
      最近更新 更多