Django:高级查询

时间:2015-12-13 11:56:59

标签: django django-queryset

SessionPhrase Phrase组成,每个Motordre按特殊顺序通过字段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)

我试着从类似的东西开始:

{{1}}

但现在我被卡住了......知道如何做到这一点?

2 个答案:

答案 0 :(得分:0)

我似乎找到了它,但我不知道它是否是最干净的&正确的方法:

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

答案 1 :(得分: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”