如何获取TextField在DRF的API浏览器中呈现?

时间:2019-05-20 14:51:59

标签: django django-rest-framework

使用DRF,我有一个User模型,其中包括一个Address字段,它是一个TextField。当我在API浏览器中查看UserList端点时,地址如下所示:

"address": "<django.db.models.fields.TextField>",

从文档中,我认为我需要在序列化程序中使用它:

    address = serializers.CharField(
        max_length=1000,
        style={'base_template': 'textarea.html'},
    )

...但是那不能解决问题。 PhoneNumberField类型字段发生了同样的事情:

"phone_number": "<phonenumber_field.modelfields.PhoneNumberField>",

我在序列化器中将它们重新定义为CharField。

更新:

我的模型和序列化器比平常复杂一些,因为我将“地址”,“国家/地区”和“三个电话”字段划分为不同的类,以便可以将它们包含在几种不同的模型中。

我的用户模型:

class User(AbstractUser, AddressPhoneModelMixin):
    objects = UserProfileManager()

    USERNAME_FIELD = 'email'

    type = models.CharField(
        max_length=25,
    )
    title = models.CharField(
        max_length=100,
        blank=True,
        null=True,
    )
    timezone = models.CharField(
        max_length=50,
    )
    birthdate = models.DateTimeField(
        blank=True,
        null=True,
    )
    is_verified = models.BooleanField(
        default=False,
    )
    email = models.EmailField(
        unique=True,
        db_index=True,
    )

这是“地址”和“电话”字段的模型类:

class AddressPhoneModelMixin(object):
    address = models.TextField(
        blank=True,
        null=True,
    )
    country = models.ForeignKey(
        Country,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )
    phone_number = PhoneNumberField(
        blank=True,
        null=True,
    )
    mobile_number = PhoneNumberField(
        blank=True,
        null=True,
    )
    fax_number = PhoneNumberField(
        blank=True,
        null=True,
    )

    class Meta:
        abstract = True

用户序列化器:

class UserSerializer(AddressPhoneSerializerMixin, serializers.ModelSerializer):

    permission_classes = (permissions.IsAuthenticated,)

    url = serializers.HyperlinkedIdentityField(view_name="users:user-detail")

    class Meta:
        model = User
        fields = (
            'url',
            'id',
            'type',
            'username',
            'first_name',
            'last_name',
            'full_name',
            'email',
            'address',
            'country',
            'phone_number',
            'mobile_number',
            'fax_number',
            'is_superuser',
            'is_staff',
            'is_active',
            'is_verified',
            'date_joined',
            'last_login',
        )

“地址”和“电话”字段序列化器:

class AddressPhoneSerializerMixin(serializers.Serializer):

    address = serializers.CharField(
        max_length=1000,
        style={'base_template': 'textarea.html'},
    )
    country = serializers.HyperlinkedIdentityField(
        view_name='countries:country-detail'
    )
    phone_number = serializers.CharField(
        max_length=31,
    )
    mobile_number = serializers.CharField(
        max_length=31,
    )
    fax_number = serializers.CharField(
        max_length=31,
    )

    class Meta:
        abstract = True

最后,用户查看:

class UserList(ListCreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(RetrieveUpdateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = User.objects.all()
    serializer_class = UserSerializer

我将提供一个来自API浏览器的示例,其中包含所有有问题的字段。请注意,国家/地区会按预期显示。

"email": "admin@virticl.api",
"address": "<django.db.models.fields.TextField>",
"country": "http://virticl.api/countries/1/",
"phone_number": "<phonenumber_field.modelfields.PhoneNumberField>",
"mobile_number": "<phonenumber_field.modelfields.PhoneNumberField>",
"fax_number": "<phonenumber_field.modelfields.PhoneNumberField>",

1 个答案:

答案 0 :(得分:1)

您的抽象模型mixin应该是models.Model子类:

class AddressPhoneModelMixin(models.Model):
    ...

由于继承是从右向左处理的,因此您还需要按照用户模型的基类的顺序将其放在左侧:

class User(AddressPhoneModelMixin, AbstractUser):
    ...

注意:在specify serializer fields中,您可以使用fields = '__all__'而不是单独列出它们。如果只缺少一两个,则可以改用exclude