预取困难的查询集

时间:2019-10-16 16:18:33

标签: django django-queryset

我有以下型号:

class Inote(IDeclaration):

    Time = models.DateTimeField(auto_now=True)
    Author = models.ForeignKey(User, related_name='%(class)ss')

    __unicode__ = lambda s: str(s.id) + ' (%s)'%(s._meta.model_name)


class Article(Inote):

    Title = models.CharField(max_length=50)

通过多表继承链接模型。在我看来,我尝试通过用户的查询集中的prefetch_related获取文章:

class UserList(ListView):
    model = User

    def get_queryset(self):

        qs = super(UserList, self).get_queryset().prefetch_related('inotes__article')

        for q in qs:
            for i in q.inotes.all():
                if hasattr(i,'article'):
                    print i.article

        return qs 

如果将prefetch_related('inotes__article')应用于qs,我将大致得到所需的内容-三个查询:

  1. 从“ auth_user”中选择•••
  2. 从“ testapp_inote”中选择•••从“ testapp_inote”中选择。“ Author_id” IN(“ 1”,“ 2”,“ 3”,...)
  3. SELECT•••从“ testapp_article” INNER JOIN“ testapp_inote” ON(“ testapp_article”。“ inote_ptr_id” =“ testapp_inote”。“ id”)在“ testapp_article”。“ inote_ptr_id” IN('1','2 ','3','4')

但是我不知道文章是什么inote,因此我使用if hasattr(i,'article')来区分它。我想通过Prefetch解决此问题,但是如果我这样做:

    prefetch = Prefetch("inotes", Inote.objects.filter(article__isnull=False))

    qs = super(UserList, self).get_queryset().prefetch_related(prefetch)

然后我对数据库中的每个inote有很多查询。

然后我尝试了Prefetch("inotes__article", Inote.objects.filter(article__isnull=False),但是在inotes__article上遇到了FieldError。

如何正确使用预取来解决我的问题。在这种情况下,您能否分享有关复杂查询的示例或链接?

谢谢

1 个答案:

答案 0 :(得分:0)

您还需要在select_related上使用article,将文章加入到您预取的inotes中。我的意思是:

prefetch = Prefetch("inotes", Inote.objects.select_related('article').filter(article__isnull=False))
...

这样,当您在article期间访问Django时,无需提取if hasattr(i,'article'):