Skip to content

Commit

Permalink
Merge pull request #695 from gnucoop/fix-django2-m2m-import
Browse files Browse the repository at this point in the history
use ManyToManyRelatedManager.set method to save m2m fields
  • Loading branch information
bmihelac committed Dec 11, 2017
2 parents 3ea4316 + 95dd304 commit e7a41ad
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 6 deletions.
7 changes: 5 additions & 2 deletions import_export/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ def get_value(self, obj):
value = value()
return value

def save(self, obj, data):
def save(self, obj, data, is_m2m=False):
"""
If this field is not declared readonly, the object's attribute will
be set to the value returned by :meth:`~import_export.fields.Field.clean`.
Expand All @@ -113,7 +113,10 @@ def save(self, obj, data):
obj = getattr(obj, attr, None)
cleaned = self.clean(data)
if cleaned is not None or self.saves_null_values:
setattr(obj, attrs[-1], cleaned)
if not is_m2m:
setattr(obj, attrs[-1], cleaned)
else:
getattr(obj, attrs[-1]).set(cleaned)

def export(self, obj):
"""
Expand Down
6 changes: 3 additions & 3 deletions import_export/resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,13 +316,13 @@ def after_delete_instance(self, instance, dry_run):
"""
pass

def import_field(self, field, obj, data):
def import_field(self, field, obj, data, is_m2m=False):
"""
Calls :meth:`import_export.fields.Field.save` if ``Field.attribute``
and ``Field.column_name`` are found in ``data``.
"""
if field.attribute and field.column_name in data:
field.save(obj, data)
field.save(obj, data, is_m2m)

def get_import_fields(self):
return self.get_fields()
Expand Down Expand Up @@ -351,7 +351,7 @@ def save_m2m(self, obj, data, using_transactions, dry_run):
for field in self.get_import_fields():
if not isinstance(field.widget, widgets.ManyToManyWidget):
continue
self.import_field(field, obj, data)
self.import_field(field, obj, data, True)

def for_delete(self, row, instance):
"""
Expand Down
24 changes: 24 additions & 0 deletions tests/core/fixtures/book.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[
{
"model": "core.author",
"pk": 11,
"fields": {
"name": "George R. R. Martin",
"birthday": "1948-09-20"
}
},
{
"model": "core.book",
"pk": 11,
"fields": {
"name": "A Game of Thrones",
"author": 11,
"author_email": "martin@got.com",
"imported": false,
"published": "1996-08-01",
"published_time": "21:00",
"price": 25.0,
"categories": [1]
}
}
]
2 changes: 1 addition & 1 deletion tests/core/tests/resources_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -834,7 +834,7 @@ def test_arrayfield(self):


class ManyRelatedManagerDiffTest(TestCase):
fixtures = ["category"]
fixtures = ["category", "book"]

def setUp(self):
pass
Expand Down

0 comments on commit e7a41ad

Please sign in to comment.