Вопрос или проблема
Я хочу использовать поля many2many для выбора всех сотрудников в моем собственном пользовательском модуле, называемом гоночные команды. У каждого сотрудника будет свой уровень в их команде.
Модель
class RacingTeams (models.Model):
_name = "racing.teams"
_description = "Команды службы поддержки"
_rec_name="name"
name = fields.Char(string="Название", tracking=True)
desc = fields.Char(string="Описание", tracking=True)
employee_ids = fields.Many2many(
comodel_name="hr.employee",
relation='hr_teams_rel',
column1='name',
column2='employee_id',
string='Сотрудник',
)
XML
<notebook>
<page string="Член команды" name="team_member">
<field name="employee_ids" required="1">
<tree editable="top">
<field name="name"/>
<field name="tier_id"/>
</tree>
</field>
</page>
</notebook>
Модель HR Наследование
class HelpdeskHR (models.Model):
_inherit = "hr.employee"
name = fields.Char(string="Имя сотрудника", related='resource_id.name', store=True, readonly=False, tracking=False)
tier_id = fields.Many2one('helpdesk.tier',string="Уровень", ondelete="cascade")
Но моя проблема сейчас в том, что если я добавляю сотрудника в новую команду, tier_id будет показывать с последней команды. Как сделать так, чтобы у сотрудника был другой уровень, если я добавляю его в другую команду?
Ответ или решение
Для решения вашей проблемы с использованием полей many2many в Odoo 17 в вашей пользовательской модели «Команды гонщиков» давайте подробно обсудим, как регистрация сотрудников с различными уровнями (т tier) в каждой команде может быть реализована.
1. Проблема
В текущей структуре каждого сотрудника (hr.employee
) есть поле tier_id
, которое связано с предыдущими записями. При добавлении сотрудника в новую команду, вы наблюдаете, что уровень (tier) отображается по последнему значению, что не соответствует вашему ожиданию.
2. Решение
Чтобы обеспечить возможность назначения различного уровня для сотрудников в разных командах, вам необходимо создать промежуточную модель. Эта модель будет хранить как ссылку на команду, так и ссылку на сотрудника с его соответствующим уровнем. Таким образом, вы сможете отслеживать, какой уровень применим к каждому сотруднику в каждой команде.
2.1 Создание промежуточной модели
Создайте новую модель, которая будет содержать внешние ключи на обе модели: racing.teams
и hr.employee
, а также поле для уровня (tier):
class TeamMember(models.Model):
_name = 'racing.team.member'
_description = 'Team Member'
team_id = fields.Many2one('racing.teams', string="Team", required=True, ondelete='cascade')
employee_id = fields.Many2one('hr.employee', string="Employee", required=True, ondelete='cascade')
tier_id = fields.Many2one('helpdesk.tier', string="Tier", required=True, ondelete='cascade')
2.2 Изменение модели RacingTeams
Теперь измените вашу модель RacingTeams
, чтобы использовать прежнюю модель, хранящую информацию о сотрудниках и их уровнях:
class RacingTeams(models.Model):
_name = "racing.teams"
_description = "Helpdesk Teams"
_rec_name = "name"
name = fields.Char(string="Name", tracking=True)
desc = fields.Char(string="Description", tracking=True)
team_member_ids = fields.One2many('racing.team.member', 'team_id', string='Team Members')
2.3 Обновление XML-шаблона
Вы также должны обновить XML-шаблон, чтобы отображать новую структуру:
<notebook>
<page string="Team Member" name="team_member">
<field name="team_member_ids" required="1">
<tree editable="top">
<field name="employee_id"/>
<field name="tier_id"/>
</tree>
</field>
</page>
</notebook>
3. Зачем такое изменение необходимо
Создание промежуточной модели позволяет вам легко управлять уровнями сотрудников в разных командах, обеспечивая их независимость. Это также упрощает дальнейшую модификацию или добавление новых полей или функций, связанных с членами команды, таких как графики, отчеты и т. д.
4. Заключение
Теперь с созданной промежуточной моделью и обновленной архитектурой, каждый сотрудник может иметь разные уровни в рамках разных команд. Это улучшит ваш пользовательский опыт и обеспечит гибкость управления данными о сотрудниках.
Если у вас останутся вопросы или потребуется дополнительная консультация, не стесняйтесь обращаться!