Как создать запись, не сохраняя ее в базе данных - PullRequest
3 голосов
/ 11 мая 2019

Я использую Inventory аддон Odoo 12 (но моя проблема может возникнуть с любым модулем).

В этом дополнении модель StockMove имеет поле move_line_ids.
В диалоге Detailed Operations мы можем видеть древовидную структуру всех линий движения выбранного движения.

Если мы нажмем кнопку Add a line и установим поля, значения будут сохранены в памяти, но не в базе данных, если мы не нажмем кнопку Confirm.

Я бы хотел скопировать это поведение в методе @api.onchange() моей пользовательской модели StockMove, но я не нашел, как действовать.
Если я использую метод self.move_line_ids.create() для создания новой записи, строка перемещения будет сохранена в базе данных, даже если я не нажму кнопку Confirm.

Есть кто-то, кто сумел это сделать?

Заранее спасибо!
И извините, если это дублирующий вопрос, но я еще не нашел ответ на свой вопрос> <</p>


Ответ jzeta работает, но разбивает другие поля Move, такие как reserved_availability (всегда 0) или quantity_done (всегда 1).


Я подтверждаю jzeta , так как комментарии показывают решение, которое я искал.

Большое спасибо, ребята, за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Я полагаю, что вы можете достичь этого, непосредственно присвоив значение move_line_ids.Конечно, учитывая, что поле равно One2many, вам нужно использовать специальный список триплетов для достижения этой цели.В вашем случае вам нужно [(0, _, values)], чтобы создать новую запись (где values - это словарь, содержащий значения полей каждой новой записи).В приведенном ниже примере я создаю только одну запись, прикрепленную к данному экземпляру stock.move, и просто передаю значение move_id в словаре.Вы должны дополнить код соответствующими значениями для новой строки перемещения, но учтите, что вы всегда должны сообщать новой записи, с каким перемещением запаса она связана.

@api.onchange('your_field_name')
def _onchange_field(self):
    self.move_line_ids = [(0, False, {'move_id': self.id})]
0 голосов
/ 12 мая 2019

.create метод создает запись в базе данных, поэтому он должен сделать это, если я вас понял, думаю, вы должны использовать что-то вроде TransientModel или AbstractModel?!

An Abstract model is created by a class based on models.AbstractModel instead of
the usual models.Model. It has all the attributes and capabilities of regular models; the
difference is that the ORM will not create an actual representation for it in the database. So,
it can have no data stored in it. It serves only as a template for a reusable feature that is to be
added to regular models.
...