【问题标题】:how to get posted object in django rest framework from a request如何从请求中获取 Django REST 框架中发布的对象
【发布时间】:2018-05-15 18:26:19
【问题描述】:

我对 django 和 rest 框架几乎是新手。我想从客户端获取有关请求的数据并保存模型的对象。在我的view.py 文件中,我有一个从APIView 扩展的类(例如名为 CreateUser(APIView)。从客户端,我想发布一个 JSON 文件并在此视图中获取它并将其保存在我的模型中。我该如何处理?

我的学生班级是:

from django.contrib.auth.models import User
from django.db import models


class Student(models.Model):
    user = models.ForeignKey(User)
    grade = models.IntegerField()

我已经为我的 Student 类创建了一个序列化程序。

from rest_framework import serializers

from users.models import Student


class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ('username', 'password', 'grade')

    def create(self, validated_data):
        user = validated_data.get('user')
        grade = validated_data.get('grade')
        student = Student.objects.create(self, user=user, grade=grade)
        return student

我想获取一个带有用户名密码和等级的 JSON 对象并将其保存在我的模型中。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你需要实现APIView的post()方法。要将发布的数据传递给序列化程序实例,请使用 request.data:

    class CreateUser(APIView):
        def post(self, request, format=None):
            serializer = StudentSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    要设置用户密码,请在序列化程序的创建中使用set_password()。另外最好设置密码字段write_only:

    class StudentSerializer(serializers.ModelSerializer):
        password = serializers.CharField(write_only=True)
        class Meta:
            model = Student
            fields = ('username', 'password', 'grade')
    
        def create(self, validated_data):
            user = validated_data.get('user')
            grade = validated_data.get('grade')
            student = Student.objects.create(user=user, grade=grade)
            student.set_password(validated_data.get('password') 
            return student
    

    注意Student.objects.create不要将self作为第一个参数。

    【讨论】:

    • 非常感谢您的回复。我已经在我的项目中实现了 drf 文档,但是当我去文档时。我看不到我的 createuser 端点。 url(r'^signup/', CreateUser.as_view, name='create_user'),,我在我的 urls.py 中写了这个。你知道为什么我看不到吗?
    • @salehsereshki 您是否为视图设置了permission_classes?您登录的可能用户没有此视图的权限,因此您无法在文档中看到它。
    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 2015-06-18
    • 2018-07-31
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2017-06-03
    • 2023-04-03
    相关资源
    最近更新 更多