Django模型与关系

时间:2013-09-24 17:20:03

标签: python django foreign-keys models

我知道,这类问题至少在这里被问了很多次,但我有点开始使用django而且我很难用类似的问题来解决这些问题而只是将这些东西放在一起。 / p>

我认为我的模型应该有3个classess:

class Guild(models.Model):
    name = models.CharField(max_length=50)

class Battle(models.Model):
    guild1 = models.ForeignKey(Guild, related_name="guild_one")
    guild2 = models.ForeignKey(Guild, related_name="guild_two")
    # tournament = models.ForeignKey(Tournament) ???

class Tournament(models.Model):
    name = models.CharField(max_length=50)
    ????

Battle是两个Guilds之间的战争,发生在Tournament期间。 Battles中可以有多个TournamentGuild可以参与多个Tournaments

我希望能够通过Guild(参加他们参加过的每场比赛,看看他们参加的每场比赛)进行搜索,通过锦标赛来查看已经参加过的比赛以及我希望通过锦标赛进入看看哪些公会参加过。请问上面的代码(加上我所记录的行)是否正常工作,因为我觉得Tournament课程应该参考Battle?

此外,如果您可以提供一个查询示例,该查询将采用参与特定锦标赛的所有公会名称。

1 个答案:

答案 0 :(得分:3)

模型Battle是使用外键加入锦标赛的好地方,所以你可以删除评论,尽管你应该使用引号来引用Tournament,因为它已被声明在Battle之后,即models.ForeignKey('Tournament')

要以列表格式获取所有参与公会的名称,请使用guild_one对象的backwards relation objects guild_twoGuildQ objects.values_list()。像这样:

>>> from django.db.models import Q
>>> Guild.objects.filter(Q(guild_one__tournament=t) |\
... Q(guild_two__tournament=t)).values_list('name', flat=True)
[u'red', u'blue', u'green', u'black']

假设t引用某些Tournament