Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add saves_null_values attribute to Field #611

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 6 additions & 2 deletions import_export/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,21 @@ class Field(object):
:param default: This value will be returned by
:meth:`~import_export.fields.Field.clean` if this field's widget did
not return an adequate value.

:param saves_null_values: Controls whether null values are saved on the object
"""
empty_values = [None, '']

def __init__(self, attribute=None, column_name=None, widget=None,
default=NOT_PROVIDED, readonly=False):
default=NOT_PROVIDED, readonly=False, saves_null_values=True):
self.attribute = attribute
self.default = default
self.column_name = column_name
if not widget:
widget = widgets.Widget()
self.widget = widget
self.readonly = readonly
self.saves_null_values = saves_null_values

def __repr__(self):
"""
Expand Down Expand Up @@ -109,7 +112,8 @@ def save(self, obj, data):
attrs = self.attribute.split('__')
for attr in attrs[:-1]:
obj = getattr(obj, attr, None)
setattr(obj, attrs[-1], self.clean(data))
if self.clean(data) != None or self.saves_null_values:
setattr(obj, attrs[-1], self.clean(data))

def export(self, obj):
"""
Expand Down
11 changes: 11 additions & 0 deletions tests/core/tests/fields_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,14 @@ def test_default_falsy_values(self):
def test_default_falsy_values_without_default(self):
field = fields.Field(column_name='name')
self.assertEqual(field.clean({'name': 0}), 0)

def test_saves_null_values(self):
field = fields.Field(column_name='name', attribute='name', saves_null_values=False)
row = {
'name': None,
}
field.save(self.obj, row)
self.assertEqual(self.obj.name, 'Foo')

self.field.save(self.obj, row)
self.assertIsNone(self.obj.name)