2013-09-24 3 views
0

Я знаю, вопросы такого рода задавались по крайней мере несколько раз здесь, но я вроде как начинаю с django, и мне сложно найти решения из похожих вопросов и просто поместить это вместе.Модель Django с отношениями

Я думаю, что моя модель должна иметь 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 в Tournament. A Guild может участвовать в нескольких Tournaments.

Я хочу, чтобы у вас была возможность найти гильдию (чтобы увидеть каждую битву за них, с каждого турнира, в котором они приняли участие), Турниром, чтобы узнать, какие битвы были разыграны, плюс я хотел бы получить доступ через Турнир чтобы увидеть, какие гильдии когда-либо участвовали. Будет ли вышеприведенный код (плюс строка, которую я заработал) работать, потому что мне кажется, что, возможно, в турнирном классе должна быть ссылка на битву?

Кроме того, если вы могли бы привести пример запроса, который будет содержать имена всех Гильдий, которые участвовали в данном турнире.

ответ

3

Модель Battle является прекрасным местом для иметь внешний ключ к турниру, так что вы можете удалить комментарий, хотя вы должны использовать кавычки для ссылок на Tournament, так как он объявлен после Battle, т.е. models.ForeignKey('Tournament').

Чтобы получить имена всех участвующих гильдий в виде списка, используйте backwards relation objectsguild_one и guild_two из Guild объекта, Q 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

Очень гладкий, спасибо! Я также пытаюсь получить имена всех Гильдий, которые когда-либо сражались с конкретной Гильдией. Другими словами, все противники Гильдии и самой Гильдии. Я закодировал это, но вместо имен я получил только идентификаторы Гильдии: 'Battle.objects.filter (Q (guild1 = g) | Q (guild2 = g)). Values_list ('guild1', 'guild2'). Distinct()' , Могли бы вы сделать предложение, пожалуйста? – nutship

Смежные вопросы