You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework添加购物车时出现Cannot query 'admin': Must be 'User' instance错误

Django REST Framework添加购物车时出现Cannot query 'admin': Must be 'User' instance错误

我之前也碰到过几乎一模一样的问题,大概率是用户模型引用不规范导致的,下面给你拆解问题和修复方案:

问题根源

你打印type(request.user)发现它不是User实例,这说明两种可能:

  1. 你的项目配置了自定义用户模型(比如在settings.py里设置了AUTH_USER_MODEL = 'xxx.YourCustomUser'),但Cart模型里还是直接用了默认的django.contrib.auth.models.User作为外键关联;
  2. 你手动查询User.objects.get(id=request.user.id)的操作完全画蛇添足,甚至可能拿到错误的模型实例——如果request.user是自定义用户,你查默认User表拿到的实例和request.user根本不是同一个模型类型,自然会触发类型不匹配的错误。

修复步骤

1. 修正Cart模型的用户引用方式

永远不要直接导入User模型,而是用Django提供的get_user_model()来动态获取当前项目的用户模型,这样不管是默认User还是自定义User都能正确关联:

from django.contrib.auth import get_user_model
from django.db import models
from django.utils import timezone

# 动态获取当前项目的用户模型
User = get_user_model()

class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='carts')
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    added_at = models.DateTimeField(default=timezone.now)

2. 简化视图中的用户获取逻辑

request.user已经是经过认证的合法用户实例,完全不需要手动通过ID重新查询!你之前的查询操作反而可能引入类型不匹配的问题,直接用request.user即可:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from .models import Cart, Album

class CartView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        # 直接使用认证后的用户实例,无需额外查询
        user = request.user
        album_id = request.data.get('album_id')

        if not album_id:
            return Response({"error": "Album ID is required"}, status=400)

        try:
            album = Album.objects.get(id=album_id)
        except Album.DoesNotExist:
            return Response({"error": "Album does not exist"}, status=404)

        # 这里直接传入user=user即可,类型完全匹配
        cart_item, created = Cart.objects.get_or_create(user=user, album=album)

        if not created:
            cart_item.quantity += 1
            cart_item.save()

        return Response({"message": f"Added {album.title} to cart", "quantity": cart_item.quantity}, status=201)

额外验证点

  • 检查settings.py中是否有AUTH_USER_MODEL配置,如果有,确认get_user_model()返回的就是这个模型;
  • 修复后可以在视图中打印type(user)和Cart._meta.get_field('user').related_model,两者应该完全一致,这样就不会再出现类型不匹配的错误了。

备注:内容来源于stack exchange,提问作者Mateusz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 03:18:03