'Meal' 对象不可迭代 django rest 框架
'Meal' object is not iterable django rest framework
我正在制作一个能够将产品添加到购物车的 api,当我收到一个空篮子时,一切正常,但一旦产品进入篮子,它就会给我错误 'Meal' object is not iterable
是models.py
class Meal(models.Model):
"""Meal"""
title = models.CharField(max_length=255)
description = models.TextField(default='The description will be later')
price = models.DecimalField(max_digits=9, decimal_places=2)
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, null=True)
slug = models.SlugField()
class CartMeal(models.Model):
"""Cart Meal"""
user = models.ForeignKey('Customer', on_delete=models.CASCADE)
cart = models.ForeignKey('Cart', verbose_name='Cart', on_delete=models.CASCADE, related_name='related_meals')
meal = models.ForeignKey(Meal, verbose_name='Meal', on_delete=models.CASCADE)
qty = models.IntegerField(default=1)
final_price = models.DecimalField(max_digits=9, decimal_places=2)
class Cart(models.Model):
"""Cart"""
owner = models.ForeignKey('Customer', on_delete=models.CASCADE)
meals = models.ManyToManyField(CartMeal, related_name='related_cart', blank=True)
total_products = models.PositiveIntegerField(default=0)
final_price = models.DecimalField(max_digits=9, decimal_places=2, default=0)
in_orders = models.BooleanField(default=False)
for_anonymous_user = models.BooleanField(default=False)
是serializers.py
class CartMealSerializer(serializers.ModelSerializer):
meal = MealSerializer(many=True)
class Meta:
model = CartMeal
fields = ['id', 'meal', 'qty', 'final_price']
class CustomerSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
class Meta:
model = Customer
fields = '__all__'
class CartSerializer(serializers.ModelSerializer):
meals = CartMealSerializer(many=True)
owner = CustomerSerializer()
class Meta:
model = Cart
fields = '__all__'
是views.py
这里我调用了get方法,之后报错
class CartViewSet(viewsets.ModelViewSet):
serializer_class = CartSerializer
queryset = Cart.objects.all()
@staticmethod
def get_cart(user):
if user.is_authenticated:
return Cart.objects.get(owner=user.customer, for_anonymous_user=False)
return Cart.objects.get(for_anonymous_user=True)
@staticmethod
def _get_or_create_cart_meal(customer: Customer, cart: Cart, meal: Meal):
cart_meal, created = CartMeal.objects.get_or_create(
user=customer,
meal=meal,
cart=cart,
)
return cart_meal, created
@action(methods=['GET'], detail=False)
def current_customer_cart(self, *args, **kwargs):
cart = self.get_cart(self.request.user)
cart_serializer = CartSerializer(cart)
return response.Response(cart_serializer.data)
请告诉我错误在哪里
一个CartMeal
模型的meal
是一个ForeignKey
,也就是说它(最多)指的是一个Meal
对象,因此你不能在序列化器中使用 many=True
:
class CartMealSerializer(serializers.ModelSerializer):
meal = <strong>MealSerializer()</strong> # ← no many=True
class Meta:
model = CartMeal
fields = ['id', 'meal', 'qty', 'final_price']
我正在制作一个能够将产品添加到购物车的 api,当我收到一个空篮子时,一切正常,但一旦产品进入篮子,它就会给我错误 'Meal' object is not iterable
是models.py
class Meal(models.Model):
"""Meal"""
title = models.CharField(max_length=255)
description = models.TextField(default='The description will be later')
price = models.DecimalField(max_digits=9, decimal_places=2)
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, null=True)
slug = models.SlugField()
class CartMeal(models.Model):
"""Cart Meal"""
user = models.ForeignKey('Customer', on_delete=models.CASCADE)
cart = models.ForeignKey('Cart', verbose_name='Cart', on_delete=models.CASCADE, related_name='related_meals')
meal = models.ForeignKey(Meal, verbose_name='Meal', on_delete=models.CASCADE)
qty = models.IntegerField(default=1)
final_price = models.DecimalField(max_digits=9, decimal_places=2)
class Cart(models.Model):
"""Cart"""
owner = models.ForeignKey('Customer', on_delete=models.CASCADE)
meals = models.ManyToManyField(CartMeal, related_name='related_cart', blank=True)
total_products = models.PositiveIntegerField(default=0)
final_price = models.DecimalField(max_digits=9, decimal_places=2, default=0)
in_orders = models.BooleanField(default=False)
for_anonymous_user = models.BooleanField(default=False)
是serializers.py
class CartMealSerializer(serializers.ModelSerializer):
meal = MealSerializer(many=True)
class Meta:
model = CartMeal
fields = ['id', 'meal', 'qty', 'final_price']
class CustomerSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
class Meta:
model = Customer
fields = '__all__'
class CartSerializer(serializers.ModelSerializer):
meals = CartMealSerializer(many=True)
owner = CustomerSerializer()
class Meta:
model = Cart
fields = '__all__'
是views.py 这里我调用了get方法,之后报错
class CartViewSet(viewsets.ModelViewSet):
serializer_class = CartSerializer
queryset = Cart.objects.all()
@staticmethod
def get_cart(user):
if user.is_authenticated:
return Cart.objects.get(owner=user.customer, for_anonymous_user=False)
return Cart.objects.get(for_anonymous_user=True)
@staticmethod
def _get_or_create_cart_meal(customer: Customer, cart: Cart, meal: Meal):
cart_meal, created = CartMeal.objects.get_or_create(
user=customer,
meal=meal,
cart=cart,
)
return cart_meal, created
@action(methods=['GET'], detail=False)
def current_customer_cart(self, *args, **kwargs):
cart = self.get_cart(self.request.user)
cart_serializer = CartSerializer(cart)
return response.Response(cart_serializer.data)
请告诉我错误在哪里
一个CartMeal
模型的meal
是一个ForeignKey
,也就是说它(最多)指的是一个Meal
对象,因此你不能在序列化器中使用 many=True
:
class CartMealSerializer(serializers.ModelSerializer):
meal = <strong>MealSerializer()</strong> # ← no many=True
class Meta:
model = CartMeal
fields = ['id', 'meal', 'qty', 'final_price']