Skip to content

Commit ae73b85

Browse files
committed
FIX: Retain PK if provided and ensure a crash if it mismatches on key_field. #10
1 parent f74abb1 commit ae73b85

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

bulk_sync/__init__.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ def get_key(obj):
4444
old_obj = obj_dict.pop(get_key(new_obj), None)
4545
if old_obj is None:
4646
# This is a new object, so create it.
47-
# Make sure the primary key field is clear.
48-
new_obj.pk = None
4947
new_objs.append(new_obj)
5048
else:
5149
new_obj.id = old_obj.id
@@ -109,8 +107,6 @@ def get_key(obj):
109107
old_obj = old_obj_dict.pop(get_key(new_obj), None)
110108
if old_obj is None:
111109
# This is a new object, so create it.
112-
# Make sure the primary key field is clear.
113-
new_obj.pk = None
114110
new_objs.append(new_obj)
115111
else:
116112
new_obj.id = old_obj.id

tests/tests.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.conf import settings
2+
from django.db import IntegrityError
23
from django.db.models import Q
34
from django.test import TestCase
45

@@ -68,13 +69,27 @@ def test_all_features_at_once(self):
6869
self.assertEqual(50, new_e5.age)
6970
self.assertEqual(c1, new_e5.company)
7071

71-
def test_pk_set_but_keyfield_changes_ignores_pk(self):
72+
def test_provided_pk_is_retained_but_raises_if_mismatch_with_keyfield(self):
7273
c1 = Company.objects.create(name="Foo Products, Ltd.")
7374
e1 = Employee.objects.create(name="Scott", age=40, company=c1)
7475
new_objs = [Employee(id=e1.id, name="Notscott", age=41, company=c1)]
7576

77+
with self.assertRaises(IntegrityError):
78+
# Crashes because e1.id already exists in database, even though 'name' doesnt match so it tries to INSERT.
79+
ret = bulk_sync(new_models=new_objs, filters=Q(company_id=c1.id), key_fields=("name",))
80+
81+
unique_pk = Employee.objects.values_list('id', flat=True).order_by('-id').first() + 1
82+
new_objs = [Employee(id=unique_pk, name="Notscott", age=41, company=c1)]
7683
ret = bulk_sync(new_models=new_objs, filters=Q(company_id=c1.id), key_fields=("name",))
7784

85+
self.assertEqual(0, ret["stats"]["updated"])
86+
self.assertEqual(1, ret["stats"]["created"]) # Added 'Notscott'
87+
self.assertEqual(1, ret["stats"]["deleted"]) # Deleted 'Scott'
88+
89+
# Make sure we retained the PK
90+
self.assertEqual(Employee.objects.filter(id=unique_pk).count(), 1)
91+
92+
7893
def test_fields_parameter(self):
7994
c1 = Company.objects.create(name="Foo Products, Ltd.")
8095
c2 = Company.objects.create(name="Bar Microcontrollers, Inc.")

0 commit comments

Comments
 (0)