From 3590afc7713770cdce4bdca0e0e6a2e543dc65c4 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 15 May 2018 18:56:04 +0200 Subject: Data importer: simple management of M2M association when intermediate model is not auto --- ishtar_common/data_importer.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'ishtar_common/data_importer.py') diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 6e71d69bb..8051ca300 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -1790,7 +1790,27 @@ class Importer(object): obj_dct[attr] = values else: for v in values: - getattr(obj, attr).add(v) + related_model = getattr(obj, attr) + # an intermediary model is used + if hasattr(related_model, 'through') and \ + not related_model.through._meta.auto_created: + # try to create it with default attributes + inter_model = related_model.through + target_name, item_name = None, None + for field in inter_model._meta.get_fields(): + rel_model = getattr(field, 'related_model', None) + # assume that the first found is correct... + if rel_model == v.__class__: + target_name = field.name + elif rel_model == obj.__class__: + item_name = field.name + assert target_name is not None + assert item_name is not None + inter_model.objects.get_or_create( + **{item_name: obj, target_name: v} + ) + else: + getattr(obj, attr).add(v) # force post save script v.save() if self.simulate: -- cgit v1.2.3