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
作为属性的名称。即使属性是可重用的,方法也不应使用动词作为名称。您只需使用
全名
作为属性名即可

发布你写的序列化程序。我不理解这里的问题。