我有类似以下设置的内容:-
from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
from django.db import models
class A(models.Model):
pass
class B(models.Model):
a = models.ForeignKey(A)
class C(models.Model):
site = models.ForeignKey(Site)
a = models.ForeignKey(A, related_name='cs')
objects = models.Manager()
on_site = CurrentSiteManager()
如果我使用prefetch_related来获取与B的特定实例相关联的所有C,则它将获取所有 C,而与站点无关。很好
然后,我想使用自定义的on_site管理器,以便仅获取当前站点上的C,但是对象已由Django内部缓存(我认为),因此无论是否是否在当前站点上。
>>> a=A.objects.create()
>>> B.objects.create(a=a)
>>> s1=Site.objects.create(domain='site1.com')
>>> s2=Site.objects.create(domain='site2.com')
>>> C.objects.create(site=s1, a=a)
>>> C.objects.create(site=s2, a=a)
>>> b = B.objects.prefetch_related('a__cs__site').last()
>>> for c in b.a.cs(manager='on_site').all():
print c.site
site1.com
site2.com
在这种特殊情况下,我知道我可以按站点手动进行过滤,但是在实际代码中,我不需要“知道”在使用像这样的自定义反向管理器时需要做额外的过滤,因为我之前已经做过prefetch_related。
这是Django中的错误吗?随后我使用自定义管理器时,是否应该清除prefetch_related缓存?还是我在这里做错了什么?