У меня есть что-то похожее на следующую настройку: -
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 для извлечения всех Cs, связанных с конкретным экземпляром B, он выбирает все Cs, независимо от того, Сайт. Fine
Затем я хочу использовать пользовательский менеджер on_site, чтобы получить только Cs, которые находятся на текущем сайте, но объекты были кэшированы внутри 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, когда я впоследствии использую пользовательский менеджер? Или я сделал что-то не так?