respect changes in manytomany.all() lookup
This commit is contained in:
parent
73a7345584
commit
fba5025550
2 changed files with 11 additions and 2 deletions
|
@ -72,7 +72,7 @@ class ChangeSet(models.Model):
|
||||||
m2m_remove_existing.remove(value)
|
m2m_remove_existing.remove(value)
|
||||||
else:
|
else:
|
||||||
self.m2m_add_existing.setdefault(model, {}).setdefault(change.obj_pk, set()).add(value)
|
self.m2m_add_existing.setdefault(model, {}).setdefault(change.obj_pk, set()).add(value)
|
||||||
elif change.action == 'm2m_add':
|
elif change.action == 'm2m_remove':
|
||||||
m2m_add_existing = self.m2m_add_existing.get(model, {}).get(change.obj_pk, ())
|
m2m_add_existing = self.m2m_add_existing.get(model, {}).get(change.obj_pk, ())
|
||||||
if value in m2m_add_existing:
|
if value in m2m_add_existing:
|
||||||
m2m_add_existing.remove(value)
|
m2m_add_existing.remove(value)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import Manager, Prefetch
|
from django.db.models import Manager, Prefetch, Q
|
||||||
from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor
|
from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor
|
||||||
|
|
||||||
|
|
||||||
|
@ -340,6 +340,15 @@ class ManyRelatedManagerWrapper(RelatedManagerWrapper):
|
||||||
pk = (obj.pk if isinstance(obj, self._obj.model) else obj)
|
pk = (obj.pk if isinstance(obj, self._obj.model) else obj)
|
||||||
self._changeset.add_m2m_remove(self._obj.instance, name=self._get_cache_name(), value=pk, author=author)
|
self._changeset.add_m2m_remove(self._obj.instance, name=self._get_cache_name(), value=pk, author=author)
|
||||||
|
|
||||||
|
def all(self):
|
||||||
|
# todo: this filtering is temporary as long as querysets do not filter themselves according to changes
|
||||||
|
filter = Q(**self._obj.core_filters)
|
||||||
|
model = type(self._obj.instance)
|
||||||
|
instance_pk = self._obj.instance.pk
|
||||||
|
filter &= ~Q(pk__in=self._changeset.m2m_remove_existing.get(model, {}).get(instance_pk, ()))
|
||||||
|
filter |= Q(pk__in=self._changeset.m2m_add_existing.get(model, {}).get(instance_pk, ()))
|
||||||
|
return self.model.objects.filter(filter)
|
||||||
|
|
||||||
|
|
||||||
class QuerySetWrapper(BaseQueryWrapper):
|
class QuerySetWrapper(BaseQueryWrapper):
|
||||||
@property
|
@property
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue