【问题标题】:create() argument after ** must be a mapping, not unicode** 之后的 create() 参数必须是映射,而不是 unicode
【发布时间】:2015-10-19 00:57:41
【问题描述】:

我正在尝试使用以下序列化程序进行嵌套写入 -

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('company', 'is_admin', 'last_modified', 'uuid')

class UserSerializer(serializers.ModelSerializer):
    profile = UserProfileSerializer()
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'profile')

    def create(self, validated_data):
        profile_data = validated_data.pop('profile')
        user = User.objects.create(**validated_data)
        for profile_data in profile_data:
            UserProfile.objects.create(user=user, **profile_data)
        return user

但是在发完帖子后,我得到了以下回溯 -

Traceback:
File "/opt/enterpass_app/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/enterpass_app/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)
File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/viewsets.py" in view
  87.             return self.dispatch(request, *args, **kwargs)
File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  466.             response = self.handle_exception(exc)
File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  463.             response = handler(request, *args, **kwargs)
File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/mixins.py" in create
  21.         self.perform_create(serializer)
File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/mixins.py" in perform_create
  26.         serializer.save()
File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/serializers.py" in save
  180.             self.instance = self.create(validated_data)
File "/opt/enterpass/core/serializers.py" in create
  20.             UserProfile.objects.create(user=user, **profile_data)

Exception Type: TypeError at /api/users/
Exception Value: create() argument after ** must be a mapping, not unicode

我正在逐字关注http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers 此处的文档,因此不确定我缺少什么。可能是我在 User 上做 OneToOneField 而不是像示例中的 ForeignKey?

编辑 - 想补充一点,即使我得到了上面的 Traceback,它仍然会发布到用户,但不会发布到用户配置文件。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    对于在键上进行 OneToOne 映射的任何人,这是正确的代码 -

    class UserProfileSerializer(serializers.ModelSerializer):
        class Meta:
            model = UserProfile
            fields = ('company', 'is_admin', 'last_modified', 'uuid')
    
    class UserSerializer(serializers.ModelSerializer):
        profile = UserProfileSerializer()
        class Meta:
            model = User
            fields = ('url', 'username', 'email', 'profile')
    
        def create(self, validated_data):
            profile_data = validated_data.pop('profile')
            user = User.objects.create(**validated_data)
            UserProfile.objects.create(user=user, **profile_data)
            return user
    

    注意以下内容被删除for profile_data in profile_data:

    没有多个值的原因。

    【讨论】:

    • 为什么没有在 UserProfileSerializer(在 UserSerializer 类下)中添加 'required = True' 作为参数?
    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2013-03-16
    • 2015-11-28
    • 2019-03-15
    相关资源
    最近更新 更多