2015-12-13 2 views
2

У меня есть Session, который состоит из Phrase и каждый Phrase состоит из Mot в особом порядке через поле ordre, как это:Джанго: расширенный запрос

class Phrase(models.Model): 
    description = models.CharField(max_length=150) 

class Mot(models.Model): 
    description = models.CharField(max_length=150) 

class Session(BaseModel): 
    pass 

class SessionPhrase(models.Model): 
    session = models.ForeignKey(Session) 
    phrase = models.ForeignKey(Phrase) 

class SessionPhraseMot(models.Model): 
    session_phrase = models.ForeignKey(SessionPhrase) 
    mot = models.ForeignKey(Mot) 
    ordre = models.IntegerField(blank=False) 

У меня есть Session общий вид детали, где я хочу показать все Mot из Phrase текущего сеанса через self.object.

Я пытался начать что-то вроде:

sp = SessionPhrase.objects.filter(session=self.object) 

Но теперь я застрял ... любая идея, как это сделать?

ответ

0

Кажется, я нашел его, но я не знаю, если это чистейшая & правильный способ сделать это:

sps = SessionPhrase.objects.filter(session=self.object) 
result = [SessionPhraseMot.objects 
      .filter(session_phrase=sp) 
      .order_by('ordre') for sp in sps] 
+0

Возможно, '' session_pharse__in = sps'' будет работать. – allo

0

Ваше решение вызывает дополнительные запросы к базе данных для каждого SessionPhrase объекта, который может привести к плохой производительности в зависимости насколько велика ваша база данных.

По spanning relationships нужен только один запрос:

session_phrase_mots = SessionPhraseMot.objects.filter(session_phrase__session=self.object).order_by('ordre') 

Вы обычно начинают с типом объекта, который вы хотите иметь (в данном случае это SessionPhraseMot). Например, если вы хотите, чтобы все Mot объектов, связанных с текущей сессией вы могли бы сделать это следующим образом:

mots = Mot.objects.filter(sessionphrasemot_set__session_phrase__session=self.object) 

также посмотреть на Following relationships “backward”.