【问题标题】:django tastypie patch gives me a "500" errordjango sweetpie 补丁给了我一个“500”错误
【发布时间】:2017-01-05 13:08:53
【问题描述】:

它显示错误 "error_message": "invalid literal for int() with base 10: ''" 对于用户资源的补丁请求,我收到此错误。我的用户模型是

class User(AbstractBaseUser):

    VIA_FACEBOOK = 1
    VIA_GOOGLE = 2

    SIGN_IN_TYPES = (
        (VIA_FACEBOOK,'facebook'),
        (VIA_GOOGLE,'google')
    )

    MALE =  1
    FEMALE = 0

    GENDERA_TYPES = (
        (FEMALE,'female'),
        (MALE,'male')
         )

    SINGLE_ACCOUNT_USER = 0
    JOINT_ACCOUNT_USER = 1


    USER_TYPES = (
        (SINGLE_ACCOUNT_USER,'single_accout_user'),
        (JOINT_ACCOUNT_USER,'joint_accout_user')

    )
    first_name = models.CharField(blank = True, max_length=50)
    middle_name = models.CharField(blank=True, max_length=50,null=True )
    last_name = models.CharField(blank=True, max_length=50,null=True)
    email = models.EmailField(blank=False,unique=True,max_length=100)
    sign_in_via = models.SmallIntegerField(choices=SIGN_IN_TYPES, default=0)
    mobile = models.CharField(blank=True, max_length=10,null=True )
    dob = models.DateField(blank=True, null=True)
    profile_pic_url = models.CharField(blank=True,max_length=300,null=True)
    background_pic_url = models.CharField(blank=True,max_length=300,null=True)
    gender = models.SmallIntegerField(blank=True,choices=GENDERA_TYPES,null=True)
    user_type = models.SmallIntegerField(blank=False,choices=USER_TYPES,default=0)
    details = models.CharField(blank=True,max_length=500,null=True)
    created_on = models.DateTimeField(auto_now=True)
    slug = models.SlugField(default='')

    USERNAME_FIELD = 'email'

我的用户资源脚本是:

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'
        list_allowed_methods = ['get', 'post', 'patch', 'put','delete']
        authorization = Authorization()
        include_resource_uri = True
        always_return_data = True
        authentication = Authentication()
        filtering = {
            'id': ALL,
            'email': ALL,
            'user_type': ALL,
            'mobile': ALL,
            'created_at': ALL,
        }
        excludes = ['created_on','password','last_login','sign_in_via']

GET 和 POST 工作正常,但 PATCH 和 PUT 方法不起作用。 我正在使用 Postman 发出请求 因此,对于 PATCH 请求 (http://127.0.0.1:8888/api/user_api/user/14/?format=json),正文将是

{
  "background_pic_url": "h/h",
  "last_name":"sdfsd"
}

然后我收到 500,内部服务器错误。堆栈跟踪是

{
  "error_message": "invalid literal for int() with base 10: ''",
  "traceback": "Traceback (most recent call last):

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 220, in wrapper
    response = callback(request, *args, **kwargs)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 460, in dispatch_detail
    return self.dispatch('detail', request, **kwargs)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 483, in dispatch
    response = method(request, **kwargs)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 1669, in patch_detail
    bundle = self.full_dehydrate(bundle)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 885, in full_dehydrate
    data[field_name] = field_object.dehydrate(bundle, for_list=for_list)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\fields.py\", line 146, in dehydrate
    return self.convert(current_object)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\fields.py\", line 255, in convert
    return int(value)\n\nValueError: invalid literal for int() with base 10: ''"

}

对于 PUT 请求,正文将是

{
  "email":"a@a.com",
  "first_name":"a",
  "middle_name":"b",
  "last_name":"c",
    "mobile":"1234567890",
    "details":"nothing",
    "profile_pic_url":"n/n",
    "background_pic_url":"v/v",
    "sign_in_via":"1",
    "dob":"2017-01-29",
    "user_type":"1",
    "gender":"2"
}

为此,我也收到 500 内部服务器错误。堆栈跟踪是:

{
    "error_message": "'dict' object has no attribute 'first_name'",
    "traceback": "Traceback (most recent call last):

  File       \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 220, in   wrapper
    response = callback(request, *args, **kwargs)

  File    \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 460, in dispatch_detail
    return self.dispatch('detail', request, **kwargs)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 483, in dispatch
    response = method(request, **kwargs)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 1472, in put_detail
    updated_bundle = self.obj_update(bundle=bundle, **self.remove_api_resource_names(kwargs))

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 2226, in obj_update
    bundle = self.full_hydrate(bundle)

  File \"C:\\Python27\\lib\\site-packages\\tastypie\\resources.py\", line 939, in full_hydrate
    setattr(bundle.obj, field_object.attribute, value)\n\nAttributeError: 'dict' object has no attribute 'first_name'"

}

我不知道为什么我会收到这些错误。

【问题讨论】:

  • 向我们展示处理请求的控制器的代码
  • 嘿@AminEtesamian,因为我使用的是tastepie,PUT,PATCH,GET,POST不需要任何代码。资源将自动处理这些请求。而且我没有对这些请求使用任何辅助方法。

标签: python django tastypie


【解决方案1】:

您的 PUT 主体具有:

{
  ...
  "user_type": "1",
  "gender": "2"
}

和您的模型字段:

gender = models.SmallIntegerField(blank=True,choices=GENDERA_TYPES,null=True)
user_type = models.SmallIntegerField(blank=False,choices=USER_TYPES,default=0)

所以你必须像在模型中指定的那样使用数字来发出 PUT/PATCH 请求

{
  ...
  "user_type": 1,
  "gender": 2
}

在 JSON 中是有效的。

希望这会有所帮助。

问候!

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2015-05-10
    • 2012-08-05
    相关资源
    最近更新 更多