0

(i.e. if user role is passenger create instance for passenger and if user is driver create respective instance for driver and etc.)I think it's a matter of signals but I need someone to show me the logical ways todo it.)

class MyUser(AbstractUser):
    first_name = models.CharField(max_length=100,null=True)
    last_name = models.CharField(max_length=100,null=True)
    email = models.EmailField(null=True)
    ROLE = (
                    ('Passenger', 'Passenger'),
                    ('TSHO', 'TSHO'),
                    ('Employee', 'Employee'),
                    ('Driver', 'Driver'),
                   )
   role = models.CharField(max_length=200, choices=ROLE)

--this the model in which I want to create the instance if user role is driver

class Driver(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on delete=models.CASCADE, related_name='employee')
    occupation=models.CharField(max_length=200,null=True)
    address=models.CharField(max_length=100,null=True)
    house_no=models.CharField(max_length=100,null=True) 

--and this the model in which I want to create the instance if user role is passenger

class Passenger(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,related_name='passenger')
    sex = models.CharField(max_length=200, choices=(('male', 'male'), ('female', 'female')),null=True)
    bio = models.TextField(max_length=500, blank=True)
    location = models.CharField(max_length=30, blank=True)
    birth_date = models.DateField(null=True, blank=True)
ForceBru
  • 43,482
  • 10
  • 63
  • 98
Muba
  • 1
  • 2

1 Answers1

0

There are two approaches, one using signals and another one is overriding the save method. I would prefer the latter, since it's less error-prone and more obvious.

class MyUser(AbstractUser):
  ...
  def save(self, *args, **kwargs):
    from app.models import Driver, Passenger  # avoid circular import issues

    adding = self._state.adding
    super().save(*args, **kwargs)
    if not adding:
        return

    if self.role == 'Driver': # should use models.TextChoices to avoid magic strings
        Driver.objects.create(user=self)
    elif self.role == 'Passenger':
        Passenger.objects.create(user=self)

Docs on models.TextChoices

P.S. Please read this question about using null=True - you are doing it wrong.

Alexandr Tatarinov
  • 3,946
  • 1
  • 15
  • 30