2

excludes在 ModelResource 的 Meta 类中遇到了属性问题。

我为用户创建了 ModelResource。

class UserResource(ModelResource):
    class Meta:
        serializer = Serializer(formats=['json'])
        queryset = User.objects.all()
        excludes = ['password', 'is_active', 'is_staff', 'is_superuser']
        resource_name = 'user'
        always_return_data = True
        authentication = ApiKeyAuthentication()
        authorization = UserAuthorization()

它与doc中的那个非常相似。

我发送PUT更新username
{"username": "bara", "first_name": "bara", "last_name": "", "email": "bara@example.com", "last_login": "2013-10-09T15:32:55.056235","id": 7, "date_joined": "2013-10-09T15:32:55.056235"}

一切都很完美。

但是我不想直接使用这个资源我想使用这个。

class ProfileResource(ModelResource):
    user = fields.ToOneField(UserResource, 'user', full=True)

    class Meta:
        serializer = Serializer(formats=['json'])
        queryset = Profile.objects.all()
        resource_name = 'profile'
        excludes = ['created', 'modified']
        always_return_data = True
        authentication = ApiKeyAuthentication()
        authorization = ProfileAuthorization()
        ...

我发送PUT更新username{ "user": {"username": "barabara", "first_name": "bara", "last_name": "", "email": "bara@example.com", "last_login": "2013-10-09T15:32:55.056235", "id": 7, "date_joined": "2013-10-09T15:32:55.056235"}, "gender": 0, "birth_date": null}

它似乎运作良好,但事实并非如此。在第二种情况下,密码以某种方式被覆盖。我ValueError: Unknown password hashing algorithm.
在管理面板中看到: 在此处输入图像描述

我试图excludes在 ProfileResource 的 Meta中设置user__passwordpassword但似乎无济于事。

附加信息:
- 用户和个人资料是一一对应的。
- Python 2.7、Django 1.4.3、Tastypie 0.9.12

编辑:
我很抱歉造成混淆,但这仅在username更新期间发生。用户的所有其余字段都可以正常工作。

4

2 回答 2

0

我不得不实施肮脏的黑客仍然没有很好的测试所以请小心:
方法ProfileResource

def obj_update(self, bundle, **kwargs):
        """
        Additional operations for changing username.

        Changes username in database.
        """
        bundle = super(ProfileResource, self).obj_update(bundle, **kwargs)

        username, api_key = self.get_credentials(bundle.request)
        profile = Profile.get_logged(username, api_key)
        if profile:
            try:
                if bundle.data['username'] and bundle.data['username'] != profile.user.username:
                    try:
                        User.objects.get(username=bundle.data['username'])
                        logging.warning('Username %s Already exists cannot update.' % bundle.data['username'])
                    except User.DoesNotExist:
                        profile.user.username = bundle.data['username']
                        profile.user.save()

            except KeyError:
                pass

        return bundle

我知道这不是解决方案。其他选项是直接使用UserResource

于 2013-10-10T09:01:17.693 回答
0

我不确定,但我认为问题在于您执行 put 时会创建新用户,因为它会更新用户字段(例如,用没有密码字段的新用户替换现有用户,它不会合并两个用户)。

也许尝试使用其他动词?

于 2013-10-09T17:47:31.170 回答