【问题标题】:Django: Returning results into JSON from two mysql tablesDjango:将结果从两个 mysql 表返回到 JSON
【发布时间】:2015-07-04 19:35:00
【问题描述】:

stackoverflow 社区大家好,

我定义了以下两个模型(使用 python manage.py inspectdb 创建):

class StraightredFixture(models.Model):
    fixtureid = models.IntegerField(primary_key=True)
    soccerseason = models.IntegerField(db_column='soccerSeason')  # Field name made lowercase.
    home_team = models.ForeignKey('straightred.StraightredTeam', db_column='hometeamid', related_name='home_fixtures')
    away_team = models.ForeignKey('straightred.StraightredTeam', db_column='awayteamid', related_name='away_fixtures')
    fixturedate = models.DateTimeField()
    fixturestatus = models.CharField(max_length=24)
    fixturematchday = models.IntegerField()
    hometeamscore = models.IntegerField()
    awayteamscore = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'straightred_fixture'

class StraightredTeam(models.Model):
    teamid = models.IntegerField(primary_key=True)
    teamname = models.CharField(max_length=36)
    teamcode = models.CharField(max_length=5)
    teamshortname = models.CharField(max_length=24)

    class Meta:
        managed = False
        db_table = 'straightred_team'

然后我的看法如下:

def jsonfixture(request):

    data = StraightredFixture.objects.filter(fixturematchday=12)


    json_data = serializers.serialize('json', data)
    return HttpResponse(json_data, content_type='application/json')

这很好用,并产生如下可用的结果:

[{"fields": {"awayteamscore": 2, "hometeamscore": 1, "home_team": 70, "away_team": 328, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136932}, {"fields": {"awayteamscore": 1, "hometeamscore": 2, "home_team": 65, "away_team": 72, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136930}, {"fields": {"awayteamscore": 0, "hometeamscore": 0, "home_team": 338, "away_team": 71, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 137852}, {"fields": {"awayteamscore": 1, "hometeamscore": 2, "home_team": 62, "away_team": 563, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136929}, {"fields": {"awayteamscore": 0, "hometeamscore": 2, "home_team": 61, "away_team": 74, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136928}, {"fields": {"awayteamscore": 0, "hometeamscore": 1, "home_team": 67, "away_team": 69, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T15:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136931}, {"fields": {"awayteamscore": 2, "hometeamscore": 1, "home_team": 57, "away_team": 66, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-22T17:30:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136927}, {"fields": {"awayteamscore": 1, "hometeamscore": 3, "home_team": 354, "away_team": 64, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-23T13:30:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136926}, {"fields": {"awayteamscore": 2, "hometeamscore": 1, "home_team": 322, "away_team": 73, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-23T16:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136925}, {"fields": {"awayteamscore": 1, "hometeamscore": 1, "home_team": 58, "away_team": 340, "fixturematchday": 12, "soccerseason": 354, "fixturedate": "2014-11-24T20:00:00", "fixturestatus": "FINISHED"}, "model": "straightred.straightredfixture", "pk": 136924}]

唯一的问题是它返回的是“home_team”和“away_team”ID,而不是团队名称,这是期望的结果。

以前我用过:

fixture = StraightredFixture.objects.get(fixtureid=136697)
return render(request,'straightred/test.html',{'name':fixture.away_team.teamname})

这很好用,让我可以看到团队名称,但我不知道如何将这两个概念合二为一。

经过一些研究,我认为我可以简单地使用“.select_related”选项,但它似乎并没有改变我的输出。

对此的任何帮助将不胜感激。

非常感谢,艾伦。

【问题讨论】:

    标签: python mysql json django


    【解决方案1】:

    您需要在模型中定义natural_key 方法,并在serialize 夹具时设置标志,示例如下:

    class StraightredTeam(models.Model):
        teamid = models.IntegerField(primary_key=True)
        teamname = models.CharField(max_length=36)
        teamcode = models.CharField(max_length=5)
        teamshortname = models.CharField(max_length=24)
    
        def natural_key(self):
            return self.teamname
    
        class Meta:
            managed = False
            db_table = 'straightred_team'
    

    那么在序列化的时候,只需设置标志use_natural_foreign_keys=True

    json_data = serializers.serialize('json', data, use_natural_foreign_keys=True)
    

    它应该将外键 ID 序列化为它们的teamname

    Here 你可以阅读更多关于 Django 序列化和固定装置的信息。您可能也有兴趣查看dumpdata 管理命令。

    【讨论】:

    • 好消息是它运行良好。坏消息是我不知道为什么......但是:) 我要去阅读你发送的链接,以确保我了解发生了什么。非常感谢,艾伦。
    • @AlanTingey,哈哈没问题。是的,好好看看文档,它已经非常详细地解释了如何处理serializingdeserializing 固定装置。如果您只想要固定装置,您可以改用--dumpdata,但是如果您需要一个可以重用 json 输出的自定义解决方案,那么是的,您需要一个自定义序列化程序
    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2013-07-28
    相关资源
    最近更新 更多