@nurzhannogerbek

Как записать в поле c типом ManyToMany данные из другого поля автоматически?

Есть модель 'Project' c полями 'managers и 'members' у которых тип поле ManyToManyField.

Пытаюсь сделать так, чтобы при заполнении поля 'managers' записи из данного поля автоматически дублировались или записывались в поле 'members'. В админку вывожу лишь поле 'managers'. После создания объекта Project поле 'members' пустое в базе данных. Как можно решить данную проблему? Вот что сделал на данный момент:

models.py:
class Project(models.Model):
      ***
      managers = models.ManyToManyField(User, related_name='managers')
      members = models.ManyToManyField(User, related_name='members')

      def save(self, *args, **kwargs):
          if self.id:
             for manager in self.managers.all():
                if manager not in self.members.all():
                    self.members.add(manager)
           super(Project, self).save(*args, **kwargs)


Также пробовал в самой админке следующее, но безрезультатно:
admin.py:
class ProjectAdminForm(ModelForm):
    class Meta:
        model = Project
        fields = 'managers'

    def clean(self):
        members = self.cleaned_data['members']
        managers = list(self.cleaned_data['managers'])

        for manager in managers:
            if manager not in members:
                members.append(manager)

        self.cleaned_data['members'] = members

        return self.cleaned_data


class ProjectAdmin(admin.ModelAdmin):
    model = Project
    form = ProjectAdminForm

admin.site.register(Project, ProjectAdmin)
  • Вопрос задан
  • 425 просмотров
Решения вопроса 1
sim3x
@sim3x
Дублировать не надо
Есть несколько решений
- сделать в модели метод для вывода мемберс+манаджерс
class Project(models.Model):
      # ***
      def members_dict(self):
              return { 'basic_members': self.members, 'managers': self.managers}


- сделать отдельную модель и там связать пользователя, проект и его роль в нем

class ProjectMembers(models.Model):
      member = ForeignKey(Member)
      progect = ForeignKey(Progect)
      is_manager = BooleanField(default=False)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы