Serialization 如何在django的不同应用程序中扩展AbstractUser模型
我有一个类Serialization 如何在django的不同应用程序中扩展AbstractUser模型,serialization,django-models,django-rest-framework,Serialization,Django Models,Django Rest Framework,我有一个类User,它继承自另一个名为accounts的django应用程序中的AbstractUser。然后我在user字段中的Employee类中引用了它。问题是我无法在django_rest的API视图中查看用户的全名 class User(AbstractUser): def get_full_name(self): full_name = '%s %s' % (self.last_name.upper(), self.first_name) re
User
,它继承自另一个名为accounts
的django应用程序中的AbstractUser
。然后我在user
字段中的Employee
类中引用了它。问题是我无法在django_rest的API视图中查看用户的全名
class User(AbstractUser):
def get_full_name(self):
full_name = '%s %s' % (self.last_name.upper(), self.first_name)
return full_name.strip()
class Employee(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
tax_id_number = models.CharField(
max_length=20, null=True, verbose_name='Tax ID')
account_number = models.CharField(
max_length=20, null=True, verbose_name='Account Number')
joining_date = models.DateField(null=True, verbose_name="Joining Date")
designation = models.ForeignKey(Group,related_name='designation',blank=True)
department = models.ForeignKey(Group,related_name='department',blank=True)
员工序列化程序如下所示
class EmployeeSerializer(serializers.ModelSerializer):
# TODO: Define serializer fields here
user = UserSerializer
# designation = GroupListSerializer()
# department = GroupListSerializer()
class Meta:
model = Employee
# fields = '__all__'
fields = ['user','tax_id_number','account_number','joining_date','designation','department']
def create(self, validated_data):
user_data = validated_data.pop('user')
employee = Employee.objects.create(**validated_data)
for user in user_data:
user, created = User.objects.get()
employee.user.add(user)
return employee
如果使用get_full_name作为模型序列化程序中的一个字段,那么问题在于它不是一个属性 您需要使用@属性装饰器,模型序列化程序才能访问它
class User(AbstractUser):
@property
def get_full_name(self):
full_name = '%s %s' % (self.last_name.upper(), self.first_name)
return full_name.strip()
区别在于当您使用@属性装饰器时,python对象允许像字段一样访问定义的方法。DRF的序列化程序假定在字段元组中列出的名称是属性
例如:
>>> class A:
... @property
... def x(self):
... return 2
... def y(self):
... return 3
...
>>> a = A()
>>> a.x
2
>>> a.y
<bound method A.y of <__main__.A instance at 0x10556d368>>
>>>
>>A类:
... @财产
... def x(自我):
... 返回2
... 定义y(自我):
... 返回3
...
>>>a=a()
>>>a.x
2.
>>>a.y
>>>
最后一条建议是不要使用get\u full\u name
作为属性的名称。即使属性是可重用的,方法也不应使用动词作为名称。您只需使用全名
作为属性名即可 发布你写的序列化程序。我不理解这里的问题。