当前位置: 首页 > 知识库问答 >
问题:

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

梅宏盛
2023-03-14

使用DRF,我有一个用户模型,其中包括一个地址字段,这是一个文本字段。当我在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个答案

桓嘉谊
2023-03-14

您的抽象模型混合应该是一个模型。模型子类:

class AddressPhoneModelMixin(models.Model):
    ...

继承从右向左处理时,您还需要按照用户模型的基类顺序将其放在左边:

class User(AddressPhoneModelMixin, AbstractUser):
    ...

注意:要指定序列化程序字段,可以使用字段='\uuuuu all\uuuu',而不是单独列出它们。如果只缺少一个或两个,可以使用exclude

 类似资料:
  • 问题内容: 我已经成功完成了在浏览器中而不是“打开/保存”对话框中显示PDF文件的代码。现在,我一直试图在浏览器中显示Word文档。我想在Firefox,IE7+,Chrome等中显示Word文档。 有人可以帮忙吗?在浏览器中显示Word文档时,总是会出现“打开/保存”对话框。我想使用JavaScript实现此功能。 问题答案: 目前没有浏览器具有呈现Word文档所必需的代码,据我所知,当前也没有

  • 我正在测试Google Sheets API,网址为: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append 我正在使用部分来填写请求参数并执行请求(在工作表中添加一行)。 我已经按照在这里: https://developers.google.com/sheets/api/qui

  • Localhost很好,但上传到服务器时不工作 %pdf-1.3 1 0 obj<>Endobj2 0 obj<>Endobj3 0 obj<>>/Mediabox[0.000 0.000 595.280 841.890]>>Endobj4 0 obj<>stream x 2 300 p@&b m-l l,br b 5 jr k drr f b k endstream endobj 8 0 obj

  • 问题内容: 我的站点转到登录页面,我想在用户登录时重定向到另一个页面。我有一个“ POST”方法,该方法将“用户名”和“密码”发送到服务器,服务器检查用户名和密码存在。 这是我的方法 客户端能够正确发布用户名和密码,并检查其是否存在…我只是不知道如何使它呈现(重定向到???)一个新页面 问题答案: 你可以 … 重定向,(使用,将任何需要的值作为查询参数传递。例如 或者你可以.. 使用Jersey的

  • 据称,JIRA和Confluence附带了一个REST API浏览器工具 尽管默认情况下,REST API浏览器包含在JIRA服务器、Confluence服务器和Stash实例中,或者包含开发人员工具箱插件的任何应用程序中,但在艾特莱森云应用程序中不可用。https://developer.atlassian.com/server/framework/atlassian-sdk/using-the