Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ language: python

matrix:
include:
- { python: "3.6", env: DJANGO=2.1 }
- { python: "3.6", env: DJANGO=2.2 }
- { python: "3.6", env: DJANGO=3.0 }

- { python: "3.7", env: DJANGO=2.1 }
- { python: "3.7", env: DJANGO=2.2 }
- { python: "3.7", env: DJANGO=3.0 }

Expand Down
11 changes: 8 additions & 3 deletions computedfields/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import logging
import pickle

import django
from django.db import transaction
from django.db.models import QuerySet
from django.conf import settings
Expand Down Expand Up @@ -68,7 +69,7 @@ def __init__(self):
self._fk_map = {}
self._local_mro = {}
self._m2m = {}
self._batchsize = getattr(settings, 'COMPUTEDFIELDS_BATCHSIZE', 100)
self._batchsize = getattr(settings, 'COMPUTEDFIELDS_BATCHSIZE', 100 if django.VERSION >= (2,2) else 0)

# some internal states
self._sealed = False # initial boot phase
Expand Down Expand Up @@ -615,11 +616,15 @@ def bulk_updater(self, queryset, update_fields, return_pks=False, local_only=Fal
setattr(elem, comp_field, new_value)
if has_changed:
change.append(elem)
if len(change) >= self._batchsize:
if self._batchsize and len(change) >= self._batchsize:
model.objects.bulk_update(change, fields)
change = []
if change:
model.objects.bulk_update(change, fields)
if self._batchsize:
model.objects.bulk_update(change, fields)
else:
for elem in change:
elem.save(update_fields=fields, skip_computedfields=True)

# trigger dependent comp field updates on all records
# skip recursive call if queryset is empty
Expand Down
35 changes: 29 additions & 6 deletions example/test_full/tests/test_m2m_advanced.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import django
from django.test import TestCase
from ..models import Person, Group, Membership
from django.test.utils import CaptureQueriesContext
Expand All @@ -9,8 +10,14 @@ class SelfDeps(TestCase):
def setUp(self):
self.persons = [Person.objects.create(name='P{}'.format(i)) for i in range(10)]
self.groups = [Group.objects.create(name=g) for g in 'ABCDEFGHJI']
self.persons[0].groups.add(self.groups[0], self.groups[1])
self.persons[1].groups.add(self.groups[0], self.groups[1])
if django.VERSION >= (2,2):
self.persons[0].groups.add(self.groups[0], self.groups[1])
self.persons[1].groups.add(self.groups[0], self.groups[1])
else:
Membership.objects.create(person=self.persons[0], group=self.groups[0])
Membership.objects.create(person=self.persons[0], group=self.groups[1])
Membership.objects.create(person=self.persons[1], group=self.groups[0])
Membership.objects.create(person=self.persons[1], group=self.groups[1])

def test_init(self):
p0 = self.persons[0]
Expand All @@ -28,11 +35,19 @@ def test_change_group_name(self):
self.assertEqual(p0.my_groups, 'A,b')

def test_add_group(self):
Group.objects.create(name='Z').members.set([self.persons[0]])
if django.VERSION >= (2, 2):
Group.objects.create(name='Z').members.set([self.persons[0]])
else:
group = Group.objects.create(name='Z')
Membership.objects.create(group=group, person=self.persons[0])
p0 = self.persons[0]
p0.refresh_from_db()
self.assertEqual(p0.my_groups, 'A,B,Z')
p0.groups.create(name='X')
if django.VERSION >= (2, 2):
p0.groups.create(name='X')
else:
group = Group.objects.create(name='X')
Membership.objects.create(group=group, person=p0)
p0.refresh_from_db()
self.assertEqual(p0.my_groups, 'A,B,Z,X')

Expand All @@ -50,11 +65,19 @@ def test_change_person_name(self):
self.assertEqual(g0.my_members, 'P0,Px')

def test_add_person(self):
Person.objects.create(name='Py').groups.set([self.groups[0]])
if django.VERSION >= (2, 2):
Person.objects.create(name='Py').groups.set([self.groups[0]])
else:
person = Person.objects.create(name='Py')
Membership.objects.create(person=person, group=self.groups[0])
g0 = self.groups[0]
g0.refresh_from_db()
self.assertEqual(g0.my_members, 'P0,P1,Py')
g0.members.create(name='Pz')
if django.VERSION >= (2, 2):
g0.members.create(name='Pz')
else:
person = Person.objects.create(name='Pz')
Membership.objects.create(group=g0, person=person)
g0.refresh_from_db()
self.assertEqual(g0.my_members, 'P0,P1,Py,Pz')

Expand Down