Добрый день. У меня есть вопрос относительно res.partner в Odoo 15.0. Надеюсь, вы мне поможете. Я создаю модель «Студент» и хочу наследовать такие поля, как имя, телефон и адрес электронной почты, от партнера по работе с клиентами в моей новой модели. Но у меня с этим несколько проблем. Я видел, как несколько человек успешно наследовали другие модули, но просто добавляли поле или что-то в этом роде. Но у меня возникают всевозможные проблемы. Я не знаю, как правильно это сделать.
Я попытался наследовать его напрямую, сначала выполнив следующее:
class Student(models.Model):
_name = 'student'
_inherit = 'res.partner'
_description = 'Model to manage school students'
registration_ids = fields.One2many('registration', 'student_id', string='Registration')
student_DNI = fields.Integer(string='ID')
course_id = fields.Many2one('course', string='Course')
birth_date = fields.Date(string='Birth Date')
age = fields.Integer(string='Age', compute='_compute_age', store=True)`
@api.depends('birth_date') def _compute_age(self):
for student in self:
if student.birth_date:
today = fields.Date.today()
student.age = today.year - student.birth_date.year
else:
student.age = 0
Я получил эту ошибку: «TypeError: Many2many поля Student.channel_ids и res.partner.channel_ids используют одну и ту же таблицу и столбцы». Поэтому мне пришлось определить Student_channel_ids отдельно и добавить это в модель Student:
student_channel_ids = fields.Many2many( 'mail.channel', relation='student_mail_channel_rel', column1='student_id', column2='channel_id', string='Channels')
Затем он показал мне это сообщение: psycopg2.errors.DucateColumn: ya существует столбец «signup_token» в отношении «res_partner» (не знаю, почему вдруг по-испански) Намек на то, что столбец Signup_toke уже существует в отношении res_partner.
Я сдался и попробовал использовать res.partner следующим образом:
partner_id = fields.Many2one('res.partner', string='Partner', required=True, ondelete = "cascade")
Вот как это закончилось:
class Student(models.Model):
_name = 'student'
_description = 'Model to manage school students'
partner_id = fields.Many2one('res.partner', string='Partner', required=True, ondelete = "cascade")
registration_ids = fields.One2many('registration', 'student_id', string='Registration')
student_DNI = fields.Integer(string='ID')
course_id = fields.Many2one('course', string='Course')
birth_date = fields.Date(string='Birth Date')
age = fields.Integer(string='Age', compute='_compute_age', store=True)`
@api.depends('birth_date') def _compute_age(self):
for student in self:
if student.birth_date:
today = fields.Date.today()
student.age = today.year - student.birth_date.year
else:
student.age = 0
Это вид:
<odoo>
<data>
<record model = "ir.ui.view" id = "view_student_form">
<field name = "name">student.form</field>
<field name = "model">student</field>
<field name = "inherit_id" ref = "base.view_partner_form"/>
<field name = "arch" type = "xml">
<form>
<xpath expr = "//field[@name='email']" position = "after">
<field name = "birth_date"/>
<field name = "age"/>
<field name = "student_DNI"/>
<field name = "course_id"/>
</xpath>
</form>
</field>
</record>
</data>
</odoo>
Но теперь у меня проблемы с представлениями, и я даже не знаю, правильно ли я импортирую нужные мне поля. Черт возьми, пожалуйста, эта штука сводит меня с ума!





Вместо этого вы можете использовать «наследование делегирования». Хорошим примером является модель res.users:
class Users(models.Model):
""" User class."""
_name = "res.users"
_description = 'Users'
_inherits = {'res.partner': 'partner_id'}
partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, index=True,
string='Related Partner', help='Partner-related data of the user')
Итак, ваш студенческий класс будет выглядеть так:
class Student(models.Model):
""" Student class."""
_name = "student"
_description = "Studends"
_inherits = {'res.partner': 'partner_id'}
partner_id = fields.Many2one('res.partner', required=True, ondelete='restrict', auto_join=True, index=True,
string='Related Partner', help='Partner-related data of the student')
registration_ids = fields.One2many('registration', 'student_id', string='Registration')
student_DNI = fields.Integer(string='ID')
course_id = fields.Many2one('course', string='Course')
birth_date = fields.Date(string='Birth Date')
age = fields.Integer(string='Age', compute='_compute_age', store=True)