对象不可iterable Django
我有一个叫Order的模型。当我尝试使用queryset初始化时,问题出现了。我得到的'Order'对象是不可编辑的,我想是因为get_queryset被调用了两次 views.py对象不可iterable Django,django,django-rest-framework,Django,Django Rest Framework,我有一个叫Order的模型。当我尝试使用queryset初始化时,问题出现了。我得到的'Order'对象是不可编辑的,我想是因为get_queryset被调用了两次 views.py class ChechoutViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = serializers.OrderSerializer queryset = None # this line is probably not requir
class ChechoutViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.OrderSerializer
queryset = None # this line is probably not required, but some code checking tools like it to be defined.
def get_queryset(self):
cart_obj, cart_created = Cart.objects.get_or_create(user_profile=self.request.user)
billing_obj, billing_created = BillingProfile.objects.get_or_create(user_profile=self.request.user)
if billing_obj is not None:
self.queryset = models.Order.objects.new_or_get(billing_obj=billing_obj, cart_obj=cart_obj)
return self.queryset
from django.db.models.query import QuerySet
class ChechoutViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.OrderSerializer
queryset = Order.objects.all() # You should include this because it can be used to statically inspect the view
def get_queryset(self):
cart_obj, cart_created = Cart.objects.get_or_create(user_profile=self.request.user)
billing_obj, billing_created = BillingProfile.objects.get_or_create(user_profile=self.request.user)
### Changes below
if billing_obj is not None:
order = models.Order.objects.new_or_get(billing_obj=billing_obj, cart_obj=cart_obj)
if not isinstance(order, QuerySet):
queryset = Order.objects.filter(pk=order.pk)
else:
queryset = order
self.queryset = queryset
return self.queryset
models.py
class OrderManager(models.Manager):
def new_or_get(self, billing_obj, cart_obj):
qs = Order.objects.filter(billing_profile=billing_obj, cart=cart_obj, active=True)
if qs.exists():
obj = qs
else:
obj = Order.objects.create(billing_profile=billing_obj, cart=cart_obj)
return obj
行
obj=Order.objects.create(billing\u profile=billing\u obj,cart=cart\u obj)
在db中创建项目,然后在return obj
行中返回它。但是get\u queryset
应该返回一个queryset。我建议采取以下措施:
if qs.exists():
obj = qs
else:
obj_created = Order.objects.create(billing_profile=billing_obj, cart=cart_obj)
obj = Order.objects.filter(id=obj_created.id)
我建议确保返回值的类型符合预期。行
obj=Order.objects.create(billing\u profile=billing\u obj,cart=cart\u obj)
在db中创建项目,然后在返回obj
行中返回它。但是get\u queryset
应该返回一个queryset。我建议采取以下措施:
if qs.exists():
obj = qs
else:
obj_created = Order.objects.create(billing_profile=billing_obj, cart=cart_obj)
obj = Order.objects.filter(id=obj_created.id)
我建议确保返回值的类型符合预期。您的
签出视图集。get\u queryset
方法并不总是返回queryset
,因为使用了OrderManager.new\u或\u get
方法
如果查询集不存在(如果qs.exists()
),则在OrderManager.new\u或\u get
中,您将从调用Order.objects.create
返回单个对象,这也将由CheckoutViewSet.get\queryset
返回
您可以修改checkoutview.get\u queryset
方法,从new\u或\u get
检查返回类型,并使用该方法返回查询集,我在下面提供了一个示例:
views.py
class ChechoutViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.OrderSerializer
queryset = None # this line is probably not required, but some code checking tools like it to be defined.
def get_queryset(self):
cart_obj, cart_created = Cart.objects.get_or_create(user_profile=self.request.user)
billing_obj, billing_created = BillingProfile.objects.get_or_create(user_profile=self.request.user)
if billing_obj is not None:
self.queryset = models.Order.objects.new_or_get(billing_obj=billing_obj, cart_obj=cart_obj)
return self.queryset
from django.db.models.query import QuerySet
class ChechoutViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.OrderSerializer
queryset = Order.objects.all() # You should include this because it can be used to statically inspect the view
def get_queryset(self):
cart_obj, cart_created = Cart.objects.get_or_create(user_profile=self.request.user)
billing_obj, billing_created = BillingProfile.objects.get_or_create(user_profile=self.request.user)
### Changes below
if billing_obj is not None:
order = models.Order.objects.new_or_get(billing_obj=billing_obj, cart_obj=cart_obj)
if not isinstance(order, QuerySet):
queryset = Order.objects.filter(pk=order.pk)
else:
queryset = order
self.queryset = queryset
return self.queryset
如果
OrderManage.new\u或\u get
方法不返回QuerySet,则假定它是Order
的实例,并通过按主键筛选该对象来返回QuerySet。这将导致一个带有单个实例的查询集。您的CheckoutViewSet.get\u QuerySet
方法并不总是返回QuerySet
,因为使用了OrderManager.new\u或\u get
方法
如果查询集不存在(如果qs.exists()
),则在OrderManager.new\u或\u get
中,您将从调用Order.objects.create
返回单个对象,这也将由CheckoutViewSet.get\queryset
返回
您可以修改checkoutview.get\u queryset
方法,从new\u或\u get
检查返回类型,并使用该方法返回查询集,我在下面提供了一个示例:
views.py
class ChechoutViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.OrderSerializer
queryset = None # this line is probably not required, but some code checking tools like it to be defined.
def get_queryset(self):
cart_obj, cart_created = Cart.objects.get_or_create(user_profile=self.request.user)
billing_obj, billing_created = BillingProfile.objects.get_or_create(user_profile=self.request.user)
if billing_obj is not None:
self.queryset = models.Order.objects.new_or_get(billing_obj=billing_obj, cart_obj=cart_obj)
return self.queryset
from django.db.models.query import QuerySet
class ChechoutViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = serializers.OrderSerializer
queryset = Order.objects.all() # You should include this because it can be used to statically inspect the view
def get_queryset(self):
cart_obj, cart_created = Cart.objects.get_or_create(user_profile=self.request.user)
billing_obj, billing_created = BillingProfile.objects.get_or_create(user_profile=self.request.user)
### Changes below
if billing_obj is not None:
order = models.Order.objects.new_or_get(billing_obj=billing_obj, cart_obj=cart_obj)
if not isinstance(order, QuerySet):
queryset = Order.objects.filter(pk=order.pk)
else:
queryset = order
self.queryset = queryset
return self.queryset
如果OrderManage.new\u或\u get
方法不返回QuerySet,则假定它是Order
的实例,并通过按主键筛选该对象来返回QuerySet。这将导致一个带有单个实例的QuerySet