我正在尝试通过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。
答案 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
还检查您的项目设置:
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',
)}