diff --git a/facho/model/fields/field.py b/facho/model/fields/field.py
index e9c09ec..6d8e523 100644
--- a/facho/model/fields/field.py
+++ b/facho/model/fields/field.py
@@ -25,3 +25,17 @@ class Field:
if callable(call):
return call(*args)
+
+ def _create_model(self, inst, name=None, model=None):
+ try:
+ return inst._fields[self.name]
+ except KeyError:
+ if model is not None:
+ obj = model()
+ else:
+ obj = self.model()
+ if name is not None:
+ obj.__name__ = name
+ self._set_namespace(obj, self.namespace, inst.__namespace__)
+ inst._fields[self.name] = obj
+ return obj
diff --git a/facho/model/fields/many2one.py b/facho/model/fields/many2one.py
index 4b5caaa..1f6670c 100644
--- a/facho/model/fields/many2one.py
+++ b/facho/model/fields/many2one.py
@@ -13,15 +13,11 @@ class Many2One(Field):
if inst is None:
return self
assert self.name is not None
- return inst._fields[self.name]
+ return self._create_model(inst)
def __set__(self, inst, value):
assert self.name is not None
- class_model = self.model
- inst_model = class_model()
-
- self._set_namespace(inst_model, self.namespace, inst.__namespace__)
- inst._fields[self.name] = inst_model
+ inst_model = self._create_model(inst, model=self.model)
# si hay setter manual se ejecuta
# de lo contrario se asigna como texto del elemento
diff --git a/facho/model/fields/model.py b/facho/model/fields/model.py
index 9653f5a..7ae217a 100644
--- a/facho/model/fields/model.py
+++ b/facho/model/fields/model.py
@@ -10,20 +10,8 @@ class Model(Field):
if inst is None:
return self
assert self.name is not None
- return self._create_model(inst)
+ return self._create_model(inst, name=self.field_name)
def __set__(self, inst, value):
- obj = self._create_model(inst)
- obj._set_content(value)
-
- def _create_model(self, inst):
- try:
- return inst._fields[self.name]
- except KeyError:
- obj = self.model()
- if self.field_name is not None:
- obj.__name__ = self.field_name
- self._set_namespace(obj, self.namespace, inst.__namespace__)
- inst._fields[self.name] = obj
- return obj
-
+ obj = self._create_model(inst, name=self.field_name)
+ obj._set_content(value)
diff --git a/tests/test_model.py b/tests/test_model.py
index 4b1011b..fb2a30c 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -80,6 +80,22 @@ def test_many2one_with_custom_setter():
party.location = 99
assert '' == party.to_xml()
+def test_many2one_auto_create():
+ class TaxAmount(facho.model.Model):
+ __name__ = 'TaxAmount'
+
+ currencyID = fields.Attribute('currencyID')
+
+ class TaxTotal(facho.model.Model):
+ __name__ = 'TaxTotal'
+
+ amount = fields.Many2One(TaxAmount)
+
+ tax_total = TaxTotal()
+ tax_total.amount.currencyID = 'COP'
+ tax_total.amount = 3333
+ assert '3333' == tax_total.to_xml()
+
def test_field_model():
class ID(facho.model.Model):
__name__ = 'ID'