2013-09-24 146 views
0

我知道,這類問題至少在這裏被問過很多次,但是我從django開始,並且我很難從類似的問題中應用解決方案,只是把這個問題東西在一起。有關係的Django模型

我覺得我的模型應該有3類新:

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期間發生。在Tournament中可以有許多Battles。 A Guild可以參加幾個Tournaments

我希望能夠通過公會進行搜索(參加他們參加過的每場錦標賽的每場戰役),通過錦標賽查看已經進行了哪些戰鬥,以及我想通過錦標賽進入看看哪些公會參加過。請問上面的代碼(加上我指出的行)的工作,因爲我覺得也許錦標賽類應該參考戰鬥?另外,如果你可以給出一個查詢的例子,該查詢將採用參加給定錦標賽的所有公會的名字。

回答

3

模型Battle是具有外鍵一場比賽的好地方,這樣你就可以刪除評論,但你應該使用引號來引用到Tournament,因爲它是Battle後聲明,即models.ForeignKey('Tournament')

要得到所有參與公會的名字以列表格式,使用backwards relation objectsguild_oneGuild對象guild_twoQ 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

+0

很光滑,謝謝!我也試圖讓所有公會的名字都與特定的公會作戰。換句話說,一個行會和行會本身的所有對手。我編碼了這個,但是我只得到了公會id而不是名字:'Battle.objects.filter(Q(guild1 = g)| Q(guild2 = g))。values_list('guild1','guild2')。distinct()' 。你能提出一個建議嗎? – nutship