Автоматическое создание связанной модели - PullRequest
0 голосов
/ 29 ноября 2018

Мне интересно, можно ли автоматически создать связанную модель при создании первой модели.

Это модели

class Team(models.Model):
    name = models.CharField(max_length=55)


class TeamMember(models.Model):
    team = models.ForeignKey('Team', on_delete=models.CASCADE, null=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)

Так что я хочу сделать что-то вродеэто на модели 'Team'

class Team(models.Model):
    name = models.CharField(max_length=55)

    @on_new.do_this
        TeamMember.team = self
        TeamMember.user = request.user
        TeamMember.save()

Я попытался найти любую документацию по этому поводу.Но нашел только какой-то пример про одно поле.Но ничего об этом.

Ценю любую помощь.Ура!

1 Ответ

0 голосов
/ 29 ноября 2018

Я предполагаю, что вы используете формы для создания команды.

Нет прямого способа создать экземпляр TeamMember без текущего пользователя (через request).request доступен только в представлениях (если вы не используете для этого специальное промежуточное ПО или стороннюю библиотеку), поэтому мы можем отправить его форму и создать пользователя, переопределив метод save формы модели.

Таким образом, вы можете попробовать вот так:

# Override the model form's save method to create related object 

class TeamForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(TeamForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Team


    def save(self, **kwargs):
        user = self.request.user
        instance = super(TeamForm, self).save(**kwargs)
        TeamUser.objects.create(team=instance, user=user)
        return instance

И использовать эту форму в представлении:

# Update get_form_kwargs methods in create view

class TeamCreateView(CreateView):
    form_class = TeamForm
    template = 'your_template.html'

    def get_form_kwargs(self):
        kw = super(TeamCreateView, self).get_form_kwargs()
        kw['request'] = self.request
        return kw

Обновление

( из комментариев )Если у вас есть пользовательский FK, доступный в Team, вы можете использовать его для создания TeamMember, переопределив метод save.Попробуйте вот так:

class Team(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL)
    name = models.CharField(max_length=55)

    def save(self, *args, **kwargs):  # <-- Override
       instance = super(Team, self).save(*args, **kwargs)
       TeamMember.objects.create(user=instance.user, team=instance)
       return instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...