对象不可iterable Django

对象不可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

我有一个叫Order的模型。当我尝试使用queryset初始化时,问题出现了。我得到的'Order'对象是不可编辑的,我想是因为get_queryset被调用了两次

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
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