fix-#734: set attribute to None does not work (at least for fields with default values). Solves #735 as well

This commit is contained in:
DavidBord 2014-08-17 13:57:48 +03:00
parent 201b12a886
commit bdbd495a9e
3 changed files with 33 additions and 5 deletions

View File

@ -5,6 +5,7 @@ Changelog
Changes in 0.9.X - DEV Changes in 0.9.X - DEV
====================== ======================
- Set attribute to None does not work (at least for fields with default values) #734
- Querying by a field defined in a subclass raises InvalidQueryError #744 - Querying by a field defined in a subclass raises InvalidQueryError #744
- Add Support For MongoDB 2.6.X's maxTimeMS #778 - Add Support For MongoDB 2.6.X's maxTimeMS #778
- abstract shouldn't be inherited in EmbeddedDocument # 789 - abstract shouldn't be inherited in EmbeddedDocument # 789

View File

@ -37,7 +37,7 @@ class BaseField(object):
def __init__(self, db_field=None, name=None, required=False, default=None, def __init__(self, db_field=None, name=None, required=False, default=None,
unique=False, unique_with=None, primary_key=False, unique=False, unique_with=None, primary_key=False,
validation=None, choices=None, verbose_name=None, validation=None, choices=None, verbose_name=None,
help_text=None): help_text=None, null=False):
""" """
:param db_field: The database field to store this field in :param db_field: The database field to store this field in
(defaults to the name of the field) (defaults to the name of the field)
@ -60,6 +60,8 @@ class BaseField(object):
model forms from the document model. model forms from the document model.
:param help_text: (optional) The help text for this field and is often :param help_text: (optional) The help text for this field and is often
used when generating model forms from the document model. used when generating model forms from the document model.
:param null: (optional) Is the field value can be null. If no and there is a default value
then the default value is set
""" """
self.db_field = (db_field or name) if not primary_key else '_id' self.db_field = (db_field or name) if not primary_key else '_id'
@ -75,6 +77,7 @@ class BaseField(object):
self.choices = choices self.choices = choices
self.verbose_name = verbose_name self.verbose_name = verbose_name
self.help_text = help_text self.help_text = help_text
self.null = null
# Adjust the appropriate creation counter, and save our local copy. # Adjust the appropriate creation counter, and save our local copy.
if self.db_field == '_id': if self.db_field == '_id':
@ -100,10 +103,13 @@ class BaseField(object):
# If setting to None and theres a default # If setting to None and theres a default
# Then set the value to the default value # Then set the value to the default value
if value is None and self.default is not None: if value is None:
value = self.default if self.null:
if callable(value): value = None
value = value() elif self.default is not None:
value = self.default
if callable(value):
value = value()
if instance._initialised: if instance._initialised:
try: try:

View File

@ -2706,5 +2706,26 @@ class InstanceTest(unittest.TestCase):
self.assertEquals(p4.height, 189) self.assertEquals(p4.height, 189)
self.assertEquals(Person.objects(height=189).count(), 1) self.assertEquals(Person.objects(height=189).count(), 1)
def test_null_field(self):
# 734
class User(Document):
name = StringField()
height = IntField(default=184, null=True)
User.objects.delete()
u = User(name='user')
u.save()
u_from_db = User.objects.get(name='user')
u_from_db.height = None
u_from_db.save()
self.assertEquals(u_from_db.height, None)
# 735
User.objects.delete()
u = User(name='user')
u.save()
User.objects(name='user').update_one(set__height=None, upsert=True)
u_from_db = User.objects.get(name='user')
self.assertEquals(u_from_db.height, None)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()