带有自定义逆向管理器的prefetch_related缓存

时间:2018-08-13 11:51:05

标签: django

我有类似以下设置的内容:-

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缓存?还是我在这里做错了什么?

0 个答案:

没有答案