我有以下型号:
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
,我将大致得到所需的内容-三个查询:
但是我不知道文章是什么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。
如何正确使用预取来解决我的问题。在这种情况下,您能否分享有关复杂查询的示例或链接?
谢谢
答案 0 :(得分:0)
您还需要在select_related
上使用article
,将文章加入到您预取的inotes
中。我的意思是:
prefetch = Prefetch("inotes", Inote.objects.select_related('article').filter(article__isnull=False))
...
这样,当您在article
期间访问Django时,无需提取if hasattr(i,'article'):