Atualmente, estou trabalhando no tipo multiusuáriosistema de autenticação atualmente, estou estruturado em um problema, quero adicionar o ID do usuário aos campos validated_data, para que o user_id possa ser armazenado na tabela de fornecedores
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)
Como adicionar o ID do cliente que receberei da criação do objeto Customer para validated_data? Qualquer outra sugestão sobre o código é bem-vinda.
Respostas:
0 para resposta № 1Você pode passar user
parâmetro com valor como o criado customer
objeto ao criar Vendors
objeto usando .objects.create()
no create()
método de VendorsSerializer
.
Você pode fazer algo como:
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