【问题标题】:Django: TypeError: int() argument must be a string, a bytes-like object or a number, not 'ObjectId'Django:TypeError:int() 参数必须是字符串、类似字节的对象或数字,而不是“ObjectId”
【发布时间】:2020-05-27 15:51:23
【问题描述】:

我在尝试返回 JsonResponse 时遇到此类型错误。在代码中python_serializer 是一个对象,它有一个名为data 的实例变量,其中包含JsonParser().parse(request) 的结果,它是字典类型(在python 中)。稍后在代码中,当我尝试返回 json 响应时,我的程序一直给我这个错误:TypeError: int() argument must be a string, a bytes-like object or a number, not 'ObjectId'

这是完整的回溯:

Internal Server Error: /api/products Traceback (most recent call last): File "C:\Users\alexei\Columns\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner response = get_response(request) File "C:\Users\alexei\Columns\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "C:\Users\alexei\Columns\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\alexei\Columns\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "C:\Users\alexei\Columns\venv\lib\site-packages\django\views\generic\base.py", line 71, in view return self.dispatch(request, *args, **kwargs) File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\views.py", line 505, in dispatch response = self.handle_exception(exc) File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\views.py", line 465, in handle_exception self.raise_uncaught_exception(exc) File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception raise exc File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\views.py", line 502, in dispatch response = handler(request, *args, **kwargs) File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\decorators.py", line 50, in handler return func(*args, **kwargs) File "C:\Users\alexei\MongoDBClone\DjangoRestApi\Product\views.py", line 29, in product_list return JsonResponse(product_serializer.data, status=status.HTTP_201_CREATED) File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\serializers.py", line 562, in data ret = super().data File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\serializers.py", line 260, in data self._data = self.to_representation(self.instance) File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\serializers.py", line 529, in to_representation ret[field.field_name] = field.to_representation(attribute) File "C:\Users\alexei\Columns\venv\lib\site-packages\rest_framework\fields.py", line 994, in to_representation return int(value) TypeError: int() argument must be a string, a bytes-like object or a number, not 'ObjectId'

产品型号:

class Product(models.Model):
    partNumber = models.CharField(max_length=70, blank=False, default='defaultPartNum')
    description = models.TextField(blank=False, default='Default Description')

``

序列化器:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

``

查看:

@api_view(['GET', 'POST', 'DELETE'])
def product_list(request):
    if request.method == 'GET':
        products = Product.objects.all()
        searchedPartnum = request.GET.get('partNumber', None)
        if searchedPartnum is not None:
            products = products.filter(searchedPartnum__icontains=searchedPartnum)

        productSearializer = ProductSerializer(products, many=True)
        return JsonResponse(productSearializer.data, safe=False)

elif request.method == 'POST':
    product_data = JSONParser().parse(request)
    product_serializer = ProductSerializer(data=product_data)
    if product_serializer.is_valid():
        product_serializer.save()
        return JsonResponse(product_serializer.data, status=status.HTTP_201_CREATED)
    return JsonResponse(product_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

elif request.METHOD == 'DELETE':
    count = Product.objects.all().delete()
    return JsonResponse({'message': '{} Products were deleted'.format(count[0])}, status=status.HTTP_204_NO_CONTENT)

【问题讨论】:

标签: python django serialization jsonresponse


【解决方案1】:

如果您使用 mongo 作为后端,那么 django 会自动为您创建一个 id 字段 id 字段的类型为 Varchar 或 ObjectId。 但是序列化程序不知道这一点,并且正在尝试创建 IntegerField 类型,这就是您收到此错误的原因

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 2019-05-18
    • 2022-01-15
    • 1970-01-01
    • 2019-08-15
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多