Skip to content

Commit e7ab56d

Browse files
committed
Merge pull request #186 from arski/to-field-foreign-key-fix
Respect the to_field setting and the target field type
2 parents 351e845 + 87e0271 commit e7ab56d

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

simple_history/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ def copy_fields(self, model):
144144
FieldType = type(old_field)
145145
if django.get_version() >= "1.6":
146146
field_arguments['db_constraint'] = False
147+
if getattr(old_field, 'to_fields', []):
148+
field_arguments['to_field'] = old_field.to_fields[0]
149+
elif django.get_version() < "1.6" and old_field.rel.field_name != 'id':
150+
field_arguments['to_field'] = old_field.rel.field_name
151+
if getattr(old_field, 'db_column', None):
152+
field_arguments['db_column'] = old_field.db_column
147153
field = FieldType(
148154
old_field.rel.to,
149155
related_name='+',

simple_history/tests/models.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,17 @@ class UserAccessorOverride(models.Model):
250250
class Employee(models.Model):
251251
manager = models.OneToOneField('Employee', null=True)
252252
history = HistoricalRecords()
253+
254+
255+
class Country(models.Model):
256+
code = models.CharField(max_length=15, unique=True)
257+
258+
259+
class Province(models.Model):
260+
country = models.ForeignKey(Country, to_field='code')
261+
history = HistoricalRecords()
262+
263+
264+
class City(models.Model):
265+
country = models.ForeignKey(Country, db_column='countryCode')
266+
history = HistoricalRecords()

simple_history/tests/tests/test_models.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
AbstractBase, ConcreteAttr, ConcreteUtil, SelfFK, Temperature, WaterLevel,
1919
ExternalModel1, ExternalModel3, UnicodeVerboseName, HistoricalChoice,
2020
HistoricalState, HistoricalCustomFKError, Series, SeriesWork, PollInfo,
21-
UserAccessorDefault, UserAccessorOverride, Employee
21+
UserAccessorDefault, UserAccessorOverride, Employee, Country, Province,
22+
City
2223
)
2324
from ..external.models import ExternalModel2, ExternalModel4
2425

@@ -257,6 +258,21 @@ def test_self_referential_foreign_key(self):
257258
self.assertEqual([m.fk_id for m in model.history.all()],
258259
[other.id, model.id, None])
259260

261+
def test_to_field_foreign_key_save(self):
262+
country = Country.objects.create(code='US')
263+
country2 = Country.objects.create(code='CA')
264+
province = Province.objects.create(country=country)
265+
province.country = country2
266+
province.save()
267+
self.assertEqual([c.country_id for c in province.history.all()],
268+
[country2.code, country.code])
269+
270+
def test_db_column_foreign_key_save(self):
271+
country = Country.objects.create(code='US')
272+
city = City.objects.create(country=country)
273+
country_field = City._meta.get_field('country')
274+
self.assertTrue(getattr(country_field, 'db_column') in str(city.history.all().query))
275+
260276
def test_raw_save(self):
261277
document = Document()
262278
document.save_base(raw=True)

0 commit comments

Comments
 (0)