/ / acrescenta alguns novos atributos / campos a validated_data no django rest framework - django, django-models, django-rest-framework

anexar alguns novos atributos / campos a validated_data no framework django rest - django, django-models, django-rest-framework

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 № 1

Você 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