redisco.models.attributes.ReferenceField.__get__ does not read from instance
clayg opened this issue · 3 comments
clayg commented
given app/models.py as:
from redisco import models class Department(models.Model): name = models.Attribute(required=True) class Person(models.Model): name = models.Attribute(required=True) #manager = models.ReferenceField('Person', related_name='underlings') department = models.ReferenceField(Department)
You can see that ReferenceField is correctly handling the _manager_id in set, but the get is caching the referenced model on the ReferenceField instance instead of the Model instance:
>>> from app import models >>> d1 = models.Department(name='Accounting') >>> d1.save() True >>> d2 = models.Department(name='Billing') >>> d2.save() True >>> p1 = models.Person(name='Joe', department=d1) >>> p1.save() True >>> p1 <Person:1 {'department': <Department:1 {'name': 'Accounting'}>, 'name': 'Joe', 'department_id': '1'}> >>> p2 = models.Person(name='Jack', department=d2) >>> p2.save() True >>> p2 <Person:2 {'department': <Department:1 {'name': 'Accounting'}>, 'name': 'Jack', 'department_id': '2'}>
N.B.
>>> p2.department_id '2' >>> p2.department.id '1'
clayg commented
I don't think it was intentional for this test to pass:
Character.objects.create(n=32, m='a', word=word) Character.objects.create(n=33, m='b', word=word) Character.objects.create(n=34, m='c', word=word) Character.objects.create(n=34, m='d') for char in Character.objects.all(): self.assertEqual(word, char.word)
Later we assert:
self.assertTrue(d not in word.character_set)
So I'm going to change this test.
clayg commented
fixed in fork:
http://github.com/clayg/redisco
submitted pull request.
iamteem commented
Thanks! :D