diff --git a/.travis.yml b/.travis.yml index 9a625a1..b96fb60 100644 --- a/.travis.yml +++ b/.travis.yml @@ -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 } diff --git a/computedfields/resolver.py b/computedfields/resolver.py index ac1f825..5eae0f0 100644 --- a/computedfields/resolver.py +++ b/computedfields/resolver.py @@ -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 @@ -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 @@ -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 diff --git a/example/test_full/tests/test_m2m_advanced.py b/example/test_full/tests/test_m2m_advanced.py index b46a634..f992c5e 100644 --- a/example/test_full/tests/test_m2m_advanced.py +++ b/example/test_full/tests/test_m2m_advanced.py @@ -1,3 +1,4 @@ +import django from django.test import TestCase from ..models import Person, Group, Membership from django.test.utils import CaptureQueriesContext @@ -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] @@ -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') @@ -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')