diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-05-15 18:56:04 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-06-12 08:44:34 +0200 |
commit | 3590afc7713770cdce4bdca0e0e6a2e543dc65c4 (patch) | |
tree | 8d989caf9dca94cb82469fdc9f2c515cfc3e70d3 /ishtar_common/data_importer.py | |
parent | 64596a973bca9c1b6faf150475f750a464fa7e1d (diff) | |
download | Ishtar-3590afc7713770cdce4bdca0e0e6a2e543dc65c4.tar.bz2 Ishtar-3590afc7713770cdce4bdca0e0e6a2e543dc65c4.zip |
Data importer: simple management of M2M association when intermediate model is not auto
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r-- | ishtar_common/data_importer.py | 22 |
1 files changed, 21 insertions, 1 deletions
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: |