sumpen
sumpen

Reputation: 541

Auto create related model

I am wondering if it's possible to auto create a related model upon creation of the first model.

This is the models

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)

So what I want to do is something like this on the 'Team' model

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

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

I have tried to find any documentation about this. But only found some example about onetoonefields. But nothing about this.

Appreciate any help. Cheers!

Upvotes: 0

Views: 82

Answers (1)

ruddra
ruddra

Reputation: 51988

I am assuming you are using forms to create team.

There is no direct way to create the TeamMember instance without the current user(via request). request is available in views only(unless you are using special middleware or third party library to access it), so we can send it form and create the user by overriding the save method of the modelform.

So you can try like this:

# 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

And use this form in View:

# 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

Update

(from comments)If you have the user FK availble in Team then you can use it to create TeamMember by overriding the save method. Try like this:

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

Upvotes: 2

Related Questions