Django休息api不接受原始数据

时间:2017-07-26 10:25:15

标签: django django-forms django-rest-framework

我正在尝试通过django rest framwork API创建用户。

my views.py

class MyUserViewSet(viewsets.ModelViewSet):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer  

serializer.py

class UserSerializer(serializers.ModelSerializer):
class Meta:
    model = get_user_model()
    fields = '__all__'

urls.py

 router.register(r'user', views.MyUserViewSet, 'users')

当我将数据作为表单数据提交时,用户保存工作正常。但是当我尝试使用原始数据时,我收到以下错误。

 "groups": [
    "Expected a list of items but got type \"unicode\"."
],

输入我正在传递原始数据

{
    "password":"12345678",
    "email":"mymail@yopmail.com",
    "groups":"1",
    "first_name":"Arun",
    "last_name":"Joshi"
}

我正在使用邮递员来测试这个API。

3 个答案:

答案 0 :(得分:1)

如果您使用的是Django auth用户模型,则用户和组之间的关系可能很多。用户可以属于多个组。因此,如果要使用相同的有效负载为您工作,则应为序列化程序编写自定义创建方法。它会是这样的

from django.contrib.auth.models import Group
def create(self, validated_data):
     user = get_user_model().objects.create(
               email=validated_data.get('email'),
               first_name=validated_data.get('first_name'),
               last_name=validated_data.get('last_name')
            )
     user.set_password('password')
     g = Group.objects.get(id=validated_data.get('group')) 
     g.user_set.add(user)

您应该在邮递员中将内容类型设置为json。

答案 1 :(得分:1)

你只需要发布这样的数据,

{
    "password":"12345678",
    "email":"mymail@yopmail.com",
    "groups":[1],
    "first_name":"Arun",
    "last_name":"Joshi"
}

要记住一些事情,

  • 用户和群组之间的关系是ManyToMany。因此,序列化程序仅接受数据作为列表。您可能需要编写自定义创建方法,如@M Hassan建议的那样,或者您只需要将其作为列表发布。

  • 主键是整数字段,不要将它们作为字符串发布。如果这样做,请确保编写适当的代码以便捕获相同的代码。

答案 2 :(得分:0)

如果您使用class CompanyData { String actualCompanyName; Long stakeValue; Long incomeValue; } 设置在你的标题 requests 喜欢这个

content-type: application/json

对于 postman ,只需添加此类标题即可 enter image description here

还检查您的项目设置:

headers= {'content-type':'application/json'}
data = {
"password":"12345678",
"email":"mymail@yopmail.com",
"groups":"1",
"first_name":"Arun",
"last_name":"Joshi"}
resp = requests.post(url, headers=headers, data=data)

同时检查:

REST_FRAMEWORK = {
'PAGE_SIZE': 10,
'DEFAULT_RENDERER_CLASSES': (
    'rest_framework.renderers.JSONRenderer',
    'rest_framework.renderers.BrowsableAPIRenderer',
)}