Django访问序列化程序中的嵌套对象字段

Bor*_*éec 2 python django django-rest-framework

Django-Rest有一个类User包含的领域first_name,而一个类Account包含的字段usernamea_class_ref这是一个one-to-one'关系。

如何在序列化程序中B执行以下操作:

class AccountSerializer():
    class Meta:
        model= Account
        fields= [
          'username',
          'firstname` 
        ]
Run Code Online (Sandbox Code Playgroud)

帐户 :

class Account(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        related_name='account',
        on_delete=models.CASCADE
    )
    def username(self):
        return self.user.username <== this is the solution that I'm trying to avoid 
Run Code Online (Sandbox Code Playgroud)

并且UserAbstractUserDjango-rest-framework的扩展,它带有一个first_name = models.CharField(_('first name'), max_length=30, blank=True)

谢谢

sli*_*der 5

您可以使用以下source属性声明自定义字段:

class BSerializer(serializers.ModelSerializer):
    a_field = serializers.CharField(source='a_class_ref.a_field')

    class Meta:
        model= B
        fields= ['b_field', 'a_field']
Run Code Online (Sandbox Code Playgroud)

编辑

根据您发布的模型,以下内容应该有效:

class Account(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        related_name='account',
        on_delete=models.CASCADE
    )

class AccountSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    firstname = serializers.CharField(source='user.first_name')

    class Meta:
        model= Account
        fields= ['username', 'firstname']
Run Code Online (Sandbox Code Playgroud)