skip to Main Content

i have this issue on my application.
Object of type QuerySet is not JSON serializable
In fact, i creating an application in which we have a relationship of the type several Products inone or more Orders.

Here is my code :

models.py

# model Product
class Products(models.Model):
    product_id = models.AutoField(primary_key=True)
    product_name = models.CharField(max_length=500)
    class Meta:
        db_table ="products"


# model Order
class Orders(models.Model):
    order_id = models.AutoField(primary_key=True)
    order_number = models.CharField(max_length=500)
    supply = models.ForeignKey(Supplies, on_delete = models.CASCADE)
    statut = models.CharField(max_length=500, default="validé")
    date_of_order = models.DateField()
    products = models.ManyToManyField(Products, through='OrderProduct')
    class Meta:
        db_table ="orders"


# model OrderProduct
class OrderProduct(models.Model):
    Order = models.ForeignKey(Orders, on_delete=models.CASCADE)
    product = models.ForeignKey(Products, on_delete=models.CASCADE)
    product_quantity = models.PositiveIntegerField(default=1)
    class Meta:
        db_table ="ordersproducts"

views.py

# OrderGetAllApi
@csrf_exempt
def order_list(request):
    orders = Orders.objects.select_related('supply').all
    # orders = Orders.objects.select_related('products').all()

    order_list = []
    for order in orders:
        order_list.append({
            'order_id': order.order_id,
            'order_number': order.order_number,
            'date_of_order': order.date_of_order,
            'supply_id': order.supply.supply_id,
            'supply_name': order.supply.supply_name,
            'supply_address': order.supply.supply_address,
            'products': order.products.all()
        })
    return JsonResponse(order_list, safe=False)

serializers.py

class OrderProductSerializer(serializers.ModelSerializer):
    product = ProductSerializer()

    class Meta:
        model = OrderProduct
        fields = ['product_id', 'product_name', 'product_quantity']
        # fields = '_all_'


class OrderSerializer(serializers.ModelSerializer):
    supply = SupplySerializer()
    products = OrderProductSerializer(many=True)

    class Meta:
        model=Orders
        fields=('order_id', 'order_number', 'date_of_order', 'statut', 'supply', 'products')

I want to get the list of order with their respective products.
when i enter the list od orders (order_list) in the browser
And i get the error Object of type QuerySet is not JSON serializable.
How can fix the problem and get the list of Orders with their products.

Thank You

3

Answers


  1. Chosen as BEST ANSWER

    Here is the good code:

    order_list = []
    for order in orders:
      order_list.append({
        'order_id': order.order_id,
        'order_number': order.order_number,
        'date_of_order': order.date_of_order,
        'supply_id': order.supply.supply_id,
        'supply_name': order.supply.supply_name,
        'supply_address': order.supply.supply_address,
        'products': list(order.products.values()) 
      })
    return JsonResponse(order_list, safe=False)
    

    )


  2. You pass this to your JSONResponse but it’s queryset and it’s not serializable.

    'products': order.products.all()
    

    You need to either convert it to list of dicts or use Serializer.

    Login or Signup to reply.
  3. Try this

    # -------- Queryset converted into Dict ----------
    order_list = []
    for order in orders:
      order_list.append({
        'order_id': order.order_id,
        'order_number': order.order_number,
        'date_of_order': order.date_of_order,
        'supply_id': order.supply.supply_id,
        'supply_name': order.supply.supply_name,
        'supply_address': order.supply.supply_address,
        'products': order.products.values()
      })
    return JsonResponse(order_list, safe=False)
    
    # -------- Using serializer ----------
    order_list = []
    for order in orders:
      order_list.append({
        'order_id': order.order_id,
        'order_number': order.order_number,
        'date_of_order': order.date_of_order,
        'supply_id': order.supply.supply_id,
        'supply_name': order.supply.supply_name,
        'supply_address': order.supply.supply_address,
        'products': OrderSerializer(order.products.all(),many=True)
      })
    return JsonResponse(order_list, safe=False)
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search