【问题标题】:Django REST framework serializer for custom form data用于自定义表单数据的 Django REST 框架序列化程序
【发布时间】:2019-04-30 13:58:05
【问题描述】:

我已经开始学习如何将 Django REST 框架与 React 一起使用,我有一个简短的问题。我制作了一个表格并分别使用CreateAPIViewUpdateAPIView 来创建/更新项目。但是,如果列表来自我的一个模型中的变量,我如何获取内容以填充我的 <select> 字段?

from model_utils import Choices

class Author(models.Model):
    GENDER = Choices('male', 'female', "I don't know really")  # How do I get this?

    gender = models.CharField(max_length=10, choices=GENDER)

Author.GENDERserializerviews 会是什么样子,因为它不是模型?

目前,这就是我现在所拥有的。

Django(我认为这里没有什么特别之处。)。

# Serializer.
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ('id', 'gender')

# View
class AuthorUpdateView(UpdateAPIView):
    queryset = Author.objects.filter(deleted_at__isnull=True)
    serializer_class = AuthorSerializer

反应。

componentDidMount() {
  const pk = this.props.match.params.pk
  axios.get(`http://localhost:8000/api/authors/${pk}`)
    .then(response => {
      const pk = response.data.id
      const gender = response.data.gender
      this.setState({gender})
    })
    .catch(err => console.log(err))
}

我对您在使用 DRF 时可能有的任何方向或概念持开放态度,因此我也可以向您学习如何使用它。

【问题讨论】:

  • 我建议把它变成像这里docs.djangoproject.com/en/2.2/ref/models/fields/#choices 这样的元组列表,这样可以避免在数据库中存储长的人类可读字符串,以后可以更改。接下来,您实际上不必提供此选项列表作为响应的一部分。这是“协议”的一部分:您有许多支持的值(性别代码),客户端应用程序应该使用这些值。因此,您可以将此列表保留在客户端应用程序中。使用您喜欢的任何人类可读的字符串。
  • 我建议创建一个新的 API 视图来返回选项
  • @JPG 有趣。序列化器/视图会是什么样子?
  • @enchance 在下面查看我的答案

标签: python django reactjs django-rest-framework


【解决方案1】:

使用viewset 组合一组相关视图的逻辑(列出、创建、更新)

class AuthorViewSet(ModelViewSet):
    queryset = Author.objects.filter(deleted_at__isnull=True)
    serializer_class = AuthorSerializer

发出OPTIONS 请求以获取资源的元数据,包括gender 字段的有效选择列表

请求

OPTIONS /api/authors/

回应

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "name": "Author List",
    "parses": [
        "application/json",
        "application/x-www-form-urlencoded",
        "multipart/form-data"
    ],
    "actions": {
        "POST": {
            "id": {
                "type": "integer",
                "required": false,
                "read_only": true,
                "label": "Id"
            },
            "gender": {
                "type": "choice",
                "required": true,
                "read_only": false,
                "label": "Gender",
                "choices": [
                    {
                        "value": "male",
                        "display_name": "male"
                    },
                    {
                        "value": "female",
                        "display_name": "female"
                    },
                    {
                        "value": "I don't know really",
                        "display_name": "I don't know really"
                    }
                ]
            }
        }
    }
}

【讨论】:

  • 我喜欢 Lucas Weyne 这个想法,但你能给我看一个示例视图/序列化器吗?我的力量没有你的那么高。
  • DRF 包含一个可配置机制,允许您返回 API 架构或其他资源信息(请参阅django-rest-framework.org/api-guide/metadata)。 APIView 默认响应 OPTIONS 请求,公开序列化程序定义的资源模式。你不需要实现这个视图,它是由 DRF 自动生成的
【解决方案2】:

正如我在评论中提到的,您可以创建一个简单的视图来返回选项。

from rest_framework.decorators import api_view
from rest_framework.response import Response


@api_view()
def foo_view(request):
    choices = [i[0] for i in Author.GENDER]
    return Response(choices)

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多