I have a 2 models:
<code>class DiscountLineMixin(models.AbstractModel):
_name = "discount.line.mixin"
_description = "Discount Line Mixin"
product_discountlist_ids = fields.One2many(
comodel_name="discountlist.percent",
inverse_name="order_line_id",
string="Product discountlist item effective_percent",
)
</code>
<code>class DiscountLineMixin(models.AbstractModel):
_name = "discount.line.mixin"
_description = "Discount Line Mixin"
product_discountlist_ids = fields.One2many(
comodel_name="discountlist.percent",
inverse_name="order_line_id",
string="Product discountlist item effective_percent",
)
</code>
class DiscountLineMixin(models.AbstractModel):
_name = "discount.line.mixin"
_description = "Discount Line Mixin"
product_discountlist_ids = fields.One2many(
comodel_name="discountlist.percent",
inverse_name="order_line_id",
string="Product discountlist item effective_percent",
)
and
<code>class ProductDiscountPercent(models.Model):
_name = "discountlist.percent"
_description = "Discountlist rules discountlist per order line"
model_name = fields.Char()
record_id = fields.Integer()
order_line_id = fields.Reference(
selection="_select_target_model",
string="Order Line",
)
discountlist_item_id = fields.Many2one(
comodel_name="product.discountlist.item",
string="Discountlist item",
)
effective_percent = fields.Float(
"Effective Percentage Price",
)
@api.model
def _select_target_model(self):
models = self.env["ir.model"].search([])
return [(model.model, model.name) for model in models]
@api.model
def create(self, vals):
if "model_name" in vals and "record_id" in vals:
vals["order_line_id"] = f"{vals['model_name']},{vals['record_id']}"
return super(ProductDiscountPercent, self).create(
vals
)
def write(self, vals):
if "model_name" in vals or "record_id" in vals:
for record in self:
model_name = vals.get("model_name", record.model_name)
record_id = vals.get("record_id", record.record_id)
vals["order_line_id"] = f"{model_name},{record_id}"
return super(ProductDiscountPercent, self).write(vals)
</code>
<code>class ProductDiscountPercent(models.Model):
_name = "discountlist.percent"
_description = "Discountlist rules discountlist per order line"
model_name = fields.Char()
record_id = fields.Integer()
order_line_id = fields.Reference(
selection="_select_target_model",
string="Order Line",
)
discountlist_item_id = fields.Many2one(
comodel_name="product.discountlist.item",
string="Discountlist item",
)
effective_percent = fields.Float(
"Effective Percentage Price",
)
@api.model
def _select_target_model(self):
models = self.env["ir.model"].search([])
return [(model.model, model.name) for model in models]
@api.model
def create(self, vals):
if "model_name" in vals and "record_id" in vals:
vals["order_line_id"] = f"{vals['model_name']},{vals['record_id']}"
return super(ProductDiscountPercent, self).create(
vals
)
def write(self, vals):
if "model_name" in vals or "record_id" in vals:
for record in self:
model_name = vals.get("model_name", record.model_name)
record_id = vals.get("record_id", record.record_id)
vals["order_line_id"] = f"{model_name},{record_id}"
return super(ProductDiscountPercent, self).write(vals)
</code>
class ProductDiscountPercent(models.Model):
_name = "discountlist.percent"
_description = "Discountlist rules discountlist per order line"
model_name = fields.Char()
record_id = fields.Integer()
order_line_id = fields.Reference(
selection="_select_target_model",
string="Order Line",
)
discountlist_item_id = fields.Many2one(
comodel_name="product.discountlist.item",
string="Discountlist item",
)
effective_percent = fields.Float(
"Effective Percentage Price",
)
@api.model
def _select_target_model(self):
models = self.env["ir.model"].search([])
return [(model.model, model.name) for model in models]
@api.model
def create(self, vals):
if "model_name" in vals and "record_id" in vals:
vals["order_line_id"] = f"{vals['model_name']},{vals['record_id']}"
return super(ProductDiscountPercent, self).create(
vals
)
def write(self, vals):
if "model_name" in vals or "record_id" in vals:
for record in self:
model_name = vals.get("model_name", record.model_name)
record_id = vals.get("record_id", record.record_id)
vals["order_line_id"] = f"{model_name},{record_id}"
return super(ProductDiscountPercent, self).write(vals)
I wanna create a one2many
relation from Abstract model to normal model.
But when i create a record from AbstractModel by:
<code>new_values = [
(0, 0, {
"model_name": self._name,
"record_id": self.id,
"discountlist_item_id": discountlist_item.id,
"effective_percent": effective_discount,
}),
]
self.write({"product_discountlist_ids": new_values})
</code>
<code>new_values = [
(0, 0, {
"model_name": self._name,
"record_id": self.id,
"discountlist_item_id": discountlist_item.id,
"effective_percent": effective_discount,
}),
]
self.write({"product_discountlist_ids": new_values})
</code>
new_values = [
(0, 0, {
"model_name": self._name,
"record_id": self.id,
"discountlist_item_id": discountlist_item.id,
"effective_percent": effective_discount,
}),
]
self.write({"product_discountlist_ids": new_values})
or
<code>discountlist_item_percent = self.env["discountlist.percent"].create({
"model_name": self._name,
"record_id": self.id,
"discountlist_item_id": discountlist_item.id,
"effective_percent": effective_discount
})
self.product_discountlist_ids = [(4, discountlist_item_percent.id)]
</code>
<code>discountlist_item_percent = self.env["discountlist.percent"].create({
"model_name": self._name,
"record_id": self.id,
"discountlist_item_id": discountlist_item.id,
"effective_percent": effective_discount
})
self.product_discountlist_ids = [(4, discountlist_item_percent.id)]
</code>
discountlist_item_percent = self.env["discountlist.percent"].create({
"model_name": self._name,
"record_id": self.id,
"discountlist_item_id": discountlist_item.id,
"effective_percent": effective_discount
})
self.product_discountlist_ids = [(4, discountlist_item_percent.id)]
in both cases i have a created discountlist_item_percent
record but adding reference to product_discountlist_ids
not work.
In debugger i have:
<code>self.product_discountlist_ids = discountlist.percent()
discountlist_item_percent = discountlist.percent(284,)
</code>
<code>self.product_discountlist_ids = discountlist.percent()
discountlist_item_percent = discountlist.percent(284,)
</code>
self.product_discountlist_ids = discountlist.percent()
discountlist_item_percent = discountlist.percent(284,)
I assume that the problem is with using field.Reference
for inverse_name
in One2Many, but not sure how to fix this to work. I need to have Reference because this abstract model is used in many other models.