字段 'id' 需要一个数字,但在 0x053A7E68 处得到 <django.contrib.auth.models.AnonymousUser 对象>

时间:2021-01-30 17:06:43

标签: python django django-rest-framework

我正在尝试使用 api 创建购物车 django rest framework。我创建了我的视图和序列化程序和 urls 。但是当我想用邮递员测试我的 api 时,我遇到了这个错误:

Field 'id' expected a number but got <django.contrib.auth.models.AnonymousUser object at 0x053A7E68>.

我想将产品添加到我的购物车。我的认证系统是令牌认证。我将在请求的标头中传递令牌,但仍然出现该错误。

我将在这里分享我的代码:

序列化器

class OrderItemSerializer(serializers.ModelSerializer):
    product = serializers.SerializerMethodField()
    final_price = serializers.SerializerMethodField()

    class Meta:
        model = OrderItem
        fields = (
            'id',
            'product',
            'quantity',
            'final_price'
        )

    def get_product(self, obj):
        return ProductSerializer(obj.item).data

    def get_final_price(self, obj):
        return obj.get_final_price()


class OrderSerializer(serializers.ModelSerializer):
    order_items = serializers.SerializerMethodField()
    total = serializers.SerializerMethodField()

    class Meta:
        model = Order
        fields = (
            'id',
            'order_items',
            'total',
            'coupon'
        )

    def get_order_items(self, obj):
        return OrderItemSerializer(obj.products.all(), many=True).data

    def get_total(self, obj):
        return obj.get_total()

#views:

class AddToCartView(APIView):
    def post(self, request, *args, **kwargs):
        slug = request.data.get('slug', None)
        if slug is None:
            return Response({"message": "Invalid request"}, status=HTTP_400_BAD_REQUEST)
        product = get_object_or_404(Product, slug=slug)
        order_item, created = OrderItem.objects.get_or_create(
            product=product,
            user=request.user,
            ordered=False
        )
        order_qs = Order.objects.filter(user=request.user, ordered=False)
        if order_qs.exists():
            order = order_qs[0]
            # check if the order item is in the order
            if order.products.filter(product__slug=product.slug).exists():
                order_item.quantity += 1
                order_item.save()
                return Response(status=HTTP_200_OK)
            else:
                order.products.add(order_item)
                return Response(status=HTTP_200_OK)

        else:
            ordered_date = timezone.now()
            order = Order.objects.create(
                user=request.user, ordered_date=ordered_date)
            order.products.add(order_item)
            return Response(status=HTTP_200_OK)

#urls:

path('add_to_cart/', AddToCartView.as_view(), name='add_to_cart'),

这是我的邮递员: 我传递了主体中的 slug 和授权中的令牌。 enter image description here

休息框架:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'SEARCH_PARAM': 'q'
}

REST_AUTH_SERIALIZERS = {
    'LOGIN_SERIALIZER': 'Accounts.serializers.LoginUserSerializer',
}

1 个答案:

答案 0 :(得分:0)

我相信错误出在您的邮递员配置中。 DRF 令牌期望标头如下所示:

Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

但是您将邮递员设置为不记名类型,并且您的令牌被“”包围

改成: enter image description here 并在此处添加令牌: enter image description here