Фильтр по ForeignKey вперед и назад - PullRequest
2 голосов
/ 21 марта 2011

У меня 3 модельных класса:

class Team(models.Model):
    name = models.CharField(max_length=100, default="", blank=True, null=True)
    number = models.IntegerField() 

class Position(models.Model):
    match = models.ForeignKey('Match')
    color = models.CharField(max_length=5)
    number = models.IntegerField()

    team = models.ForeignKey('Team')

class Match(models.Model):
    type = models.CharField(max_length=3)
    number = models.IntegerField()

    red_score = models.IntegerField(default=0)
    blue_score = models.IntegerField(default=0)

    match_events = models.TextField(max_length=1000)

Используя модели в том виде, в каком они есть сейчас, как я могу получить список совпадений, в которых выиграла команда (т. Е. Если команда принадлежит к красной позиции, добавьте ее в список, если ее совпадение имеет red_score> blue_score) )

Извините, если это сбивает с толку. Я могу попытаться уточнить, если у вас есть какие-либо конкретные вопросы.

Спасибо!

1 Ответ

2 голосов
/ 21 марта 2011

Простейший способ сделать это:

Match.objects.filter(position__color='red', red_score__gt=F('blue_score'))

Возможно, вы захотите переместить модель Position вниз, чтобы удалить апострофы из названий моделей, связанных с внешним ключом.

Это какочень хороший пример использования отношения ManyToMany:

class Team(models.Model):
    name = models.CharField(max_length=100, default="", blank=True, null=True)
    number = models.IntegerField()


class Match(models.Model):
    type = models.CharField(max_length=3)
    number = models.IntegerField()
    red_score = models.IntegerField(default=0)
    blue_score = models.IntegerField(default=0)
    match_events = models.TextField(max_length=1000)
    teams = models.ManyToManyField(Team, through='Position',
                                   related_name='matches')


class Position(models.Model):
    match = models.ForeignKey(Match)
    color = models.CharField(max_length=5)
    number = models.IntegerField()
    team = models.ForeignKey(Team)

В этом случае вы получите еще несколько опций для упрощения доступа к данным, например: если team ваша действительная команда и match выбрано одиночное совпадениегде-то ранее в коде это действительно:

team.matches.filter(red_score__gt=F('blue_score')) # all won matches of this team

match.teams.all() # teams involved in this match
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...