I am currently working on multi user type authentication system currently i am struct in a problem i want to add the user id to the validated_data fields so that user_id can be stored in the vendors table
serializers.py
class CustomerSerializers(serializers.ModelSerializer):
class Meta:
model = Customer
fields = "__all__"
def create(self,validated_data):
customer = Customer.objects.create_user(**validated_data)
return customer
class VendorsSerializers(serializers.ModelSerializer):
class Meta:
model = Vendors
fields = "__all__"
read_only_fields = ('added_on','modified_on')
def create(self, validated_data):
customer_data={"mobile_number":validated_data.pop('mobile_number'),
"password":validated_datapop.('password'),
"modified_by":validated_data.pop('modified_by'),
"added_by":validated_data.pop("added_by"),
"added_source":validated_data.pop("added_source"),
"customer_role":validated_data.pop("customer_role") }
customer = Customer.objects.create_user(**customer_data)
#Some code here to append comstomer_id to validated_data
vendor = Vendors.objects.create_user({},**validated_data)
return vendor
models.py
class CustomerManager(BaseUserManager):
def _create_user( self, mobile_number, password,customer_role,is_active, is_admin, **extra_fields):
now=timezone.now()
customer = self.model(mobile_number=mobile_number, customer_role=customer_role, is_admin=is_admin, is_active=is_active, last_login=now, added_on=now, modified_on=now,**extra_fields)
customer.set_password(password)
customer.save()
return customer
def create_user(self, mobile_number,customer_role,password=None,**extra_fields):
return self._create_user(mobile_number,password,customer_role,True,False,**extra_fields)
def create_superuser(self, mobile_number,customer_role,password=None,**extra_fields):
return self._create_user(mobile_number,password,'super',True,True,**extra_fields)
class Customer(AbstractBaseUser,PermissionsMixin):
objects = CustomerManager()
ADDED_SOURCE = (('website', 'website'),('android', 'android'),('ios', 'ios'),('super', 'super'),('vendor', 'vendor'),)
id = models.AutoField(db_column='Id', primary_key=True)
mobile_number = models.CharField(max_length=10,unique=True)
added_source = models.CharField(max_length=10, choices=ADDED_SOURCE, default='website')
added_by = models.CharField(max_length=30,default='self')
added_on = models.DateTimeField(auto_now_add=True, blank=False)
customer_role = models.CharField(max_length=8,choices=(('user','user'),('vendor','vendor'),('super','super')),default='user')
modified_on = models.DateTimeField(auto_now=True)
modified_by = models.CharField(max_length=30,default='self')
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
REQUIRED_FIELDS = ['customer_role','modified_by','added_source','added_by',]
USERNAME_FIELD = 'mobile_number'
class Meta:
managed = True
db_table = 'tbl_customer'
def get_full_name(self):
return self.mobile_number
def get_short_name(self):
return self.mobile_number
def __str__(self):
return self.mobile_number
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
def is_staff(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin
class Vendors(models.Model):
id = models.AutoField(db_column='Id',primary_key=True)
user = models.OneToOneField('Customer')
username = models.CharField(max_length=100,unique=True)
company = models.CharField(max_length=30)
company_register_address = models.CharField(max_length=255)
company_corporate_address = models.CharField(max_length=255)
contact_number = models.CharField(max_length=15)
bank_name = models.CharField(max_length=50)
bank_account_number = models.CharField(max_length=50)
bank_ifsc_code = models.CharField(max_length=50)
status = models.CharField(max_length=8,choices=(('active','active'),('inactive','inactive')))
class Meta:
db_table='tbl_vendors'
def __str__(self):
return u'%s' % (self.username)
def get_full_name(self):
return u'%s' % (self.company)
def get_short_name(self):
return u'%s' % (self.company)
How to add the customer id that i will get from Customer object creation to validated_data ? Any other suggestion about the code is welcomed.
You can pass user parameter with value as the created customer object when creating Vendors object using .objects.create() in the create() method of VendorsSerializer.
You can do something like:
class VendorsSerializers(serializers.ModelSerializer):
...
def create(self, validated_data):
customer_data={"mobile_number":validated_data.pop('mobile_number'),
"password":validated_datapop.('password'),
"modified_by":validated_data.pop('modified_by'),
"added_by":validated_data.pop("added_by"),
"added_source":validated_data.pop("added_source"),
"customer_role":validated_data.pop("customer_role") }
customer = Customer.objects.create_user(**customer_data)
# pass the created 'customer' object
vendor = Vendors.objects.create(user=customer, **validated_data)
return vendor
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With