[英]How to validade traverse attributes in DRF Serializer?
So, trying to be as brief as possible and to put my problem into context, I will tell you here my doubt.所以,尽量简短,并将我的问题放在上下文中,我会在这里告诉你我的疑问。 The problem is that I don't know how to serialize the data in a correct way.
问题是我不知道如何以正确的方式序列化数据。 How do I validadte traverse attributes inside serializer?
如何验证序列化程序中的遍历属性?
My data model is structured as follows, an employee belongs to a company unity, and this unity belongs to a company, and there is also a super administrator who can access the data of all the other users.我的数据model的结构如下,一个员工属于一个公司unity,这个unity属于一个公司,还有一个超级管理员可以访问所有其他用户的数据。
# models.py
class User(AbstractUser):
class Roles(models.IntegerChoices):
SUPER = 0, _('SuperAdmins')
COMPANY = 1, _('Company')
UNITY = 2, _('Unity')
STAFF = 3, _('Staff')
role: Roles = models.PositiveSmallIntegerField(choices=Roles.choices, default=Roles.STAFF, verbose_name=_("Role"))
objects = UserManager()
class Company(TimeStampedModel):
user: User = models.OneToOneField(User, null=True, on_delete=models.CASCADE, verbose_name=_("User"))
cnpj: str = BRCNPJField(_("CNPJ"), unique=True)
class Unity(TimeStampedModel):
user: User = models.OneToOneField(User, null=True, on_delete=models.CASCADE, verbose_name=_("Usuário"))
postal_code: str = BRPostalCodeField(verbose_name=_("CEP"), unique=False)
company = models.ForeignKey(Company, related_name='units', on_delete=models.CASCADE, verbose_name=_("Compania"))
class Staff(TimeStampedModel):
user: User = models.OneToOneField(User, null=True, on_delete=models.CASCADE, verbose_name=_("User"))
unity = models.ForeignKey(Unity, related_name="staffs", on_delete=models.CASCADE, verbose_name=_("Unity"))
cpf = BRCPFField(_("CPF"))
My serializer looks like:我的序列化器看起来像:
class RegisterStaffSerializerForModerators(serializers.ModelSerializer):
"""
The main goal of this
"""
username = serializers.CharField(source="user.username", max_length=150, allow_blank=True,
validators=[username_validator], )
email = serializers.EmailField(source="user.email", allow_blank=True, max_length=150)
first_name = serializers.CharField(source="user.first_name", allow_blank=True, max_length=150)
last_name = serializers.CharField(source="user.last_name", allow_blank=True, max_length=150)
password = serializers.CharField(source="user.password", write_only=True, max_length=150)
is_active = serializers.BooleanField(source="user.is_active", read_only=True)
class Meta:
model = Staff
fields = ('id',
'email',
"username",
'first_name',
'last_name',
'password',
'is_active',
"unity",
"cpf"
)
extra_kwargs = {
'is_active': {'read_only': True},
'password': {'write_only': True},
"id": {"read_only": True}
}
# def validate(self, attrs):
# email = attrs.get("email", "")
# print(attrs)
# return super(RegisterStaffSerializerForModerators, self).validate(attrs)
def create(self, validated_data):
user_data = validated_data["user"]
user = User.objects.create_user(
username=user_data.get('username'),
email=user_data.get('email'),
first_name=user_data.get("first_name"),
password=user_data.get('password')
)
staff = Staff.objects.create_staff(user=user, unity=validated_data.get("unity"), cpf=validated_data.get("cpf"))
return staff
To register a new staff member I need to validate the transverse attrs, but I don't want to overwrite the method of validating data and validating each field, couldn't I import the conditions from the class I am using as a base?注册一个新员工我需要验证横向属性,但我不想覆盖验证数据和验证每个字段的方法,我不能从我用作基础的 class 中导入条件吗? For example: username and e-mail be unique?
例如:用户名和电子邮件是唯一的吗?
I think you could use the UserSerializer
.我认为您可以使用
UserSerializer
。
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class RegisterStaffSerializerForModerators(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Staff
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.