Django Cart类型的对象不可JSON序列化

Django Cart类型的对象不可JSON序列化,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我有一个产品模型和一个购物车模型。我在购物车模型中加入了很多关系。 我试图返回cart模型的对象以及上下文字典,但它给出了一个错误“cart类型的对象不可JSON序列化”。 我使用的是Django版本“3.0.7” 我正在关注贾斯汀·迈克尔的教程,他正在使用较低的Django版本,并且正在进行这方面的工作。 Django改变了这件事吗 class CartManager(models.Manager): def new_or_get(self,request): cart

我有一个产品模型和一个购物车模型。我在购物车模型中加入了很多关系。 我试图返回cart模型的对象以及上下文字典,但它给出了一个错误“cart类型的对象不可JSON序列化”。 我使用的是Django版本“3.0.7”

我正在关注贾斯汀·迈克尔的教程,他正在使用较低的Django版本,并且正在进行这方面的工作。 Django改变了这件事吗

class CartManager(models.Manager):
    def new_or_get(self,request):
        cart_id = request.session.get('cart_id')
        qs = self.get_queryset().filter(id = cart_id)
        if qs.count() == 1:
            new_obj  = False
            cart_obj = qs.first()
            if request.user.is_authenticated and cart_obj.user is None:
                cart_obj.user = request.user
                cart_obj.save()
        else:
            cart_obj  = Cart.objects.new_cart(user = request.user)
            new_obj   = True
            request.session['cart_id'] = cart_obj
        return cart_obj,new_obj

    def new_cart(self,user=None):
        user_obj = None
        if user is not None:
            if user.is_authenticated:
                user_obj = user
        return self.model.objects.create(user=user_obj)
模型实际上是:

class Cart(models.Model):
    user        = models.ForeignKey(User,on_delete = models.CASCADE,null=True,blank=True) 
    products    = models.ManyToManyField(Product,blank=True)
    #more fields
而views.py是:

def cart_home(request):
    cart_obj,new_obj = Cart.objects.new_or_get(request)
    context={'cart':cart_obj}
    return render(request,'carts/cart_home.html',context)

不能将Python类实例(例如模型类实例)作为渲染数据发送,必须发送类似json的对象(Python中的dict)

因此,您需要将
cart_obj
转换为dict,这样就可以通过
render
将其发送到前端。使用Django最简单的方法是使用(在您的情况下,最好的选择是
ModelSerializer


很抱歉打扰你们,我犯了一个愚蠢的错误:

request.session['cart_id'] = cart_obj
我试图将cart对象分配给会话变量,这是一个输入错误,实际上我应该这样做:

request.session['cart_id'] = cart_obj.id

Credits:minglyu

请求。session
只能存储简单的数据结构,如list、dict,不能用于存储模型实例对象。将您的代码更改为
request.session['cart\u id']=cart\u obj.id
,下次您通过
cart.objects.get(id=request.session['cart\u id'])
获取
cart\u obj.id时,我会将以前的代码与新代码进行比较,并在明天更新
request.session['cart_id'] = cart_obj.id