DRFでAPIを作成してショッピングカートを表示したいそれは非APIバージョンで動作しますが、シリアライザでフィールドにモデルが存在しないというエラーが発生します。外部キーを持つモデルのDjango REST API
models.py
class Product(models.Model):
title = models.CharField(max_length=50, blank=False)
cover_image = models.ImageField(upload_to='products/')
summary = models.TextField()
description = models.TextField()
price = models.DecimalField(max_digits=6, decimal_places=2)
def __str__(self):
return self.title
class Cart(models.Model):
user = models.ForeignKey(User)
active = models.BooleanField(default=True)
order_date = models.DateField(null=True)
def __str__(self):
return self.user.username
class Order(models.Model):
product = models.ForeignKey(Product)
cart = models.ForeignKey(Cart)
quantity = models.IntegerField(default=1)
def __str__(self):
return self.product.title
views.py
def cartview(request):
if request.user.is_authenticated():
cart = Cart.objects.filter(user=request.user, active=True)
orders = Order.objects.filter(cart=cart)
total = 0
count = 0
for order in orders:
total += (order.product.price * order.quantity)
count += order.quantity
context = {
'total': total,
'cart': orders,
'count': count,
}
return render(request, 'store/cart.html', context)
else:
return redirect('index:index')
API/views.py
class CartAPIView(ListAPIView):
permission_classes = [IsAuthenticated]
serializer_class = CartSerializer
def get_queryset(self, **kwargs):
cart = Cart.objects.filter(user=self.request.user, active=True)
orders = Order.objects.filter(cart=cart)
total = 0
count = 0
for order in orders:
total += (order.product.price * order.quantity)
count += order.quantity
context = {
'total': total,
'cart': orders,
'count': count,
}
return context
serializers.py
class CartSerializer(ModelSerializer):
class Meta:
model = Cart
fields = [
'title',
'cover_image',
'summary',
'price',
]
このエラーが発生するフィールド名title
は、モデルCart
には無効です。
アイテムはテンプレートビューに表示されますが、apiビューには表示されません。それで私はここで何をすべきか?
カートのモデルにはタイトルというタイトルのフィールドがないため、エラーが発生します。エラーがありシリアライザクラスにあり、model = Cart(Metaサブクラスで)の代わりにmodel = Productを使うべきでしょう。私はそれが問題を解決すると思う –
私が推測するquerysetオブジェクトを返すget_queryset()メソッドを参照してください。 – Amar
このエラーは、タイトル属性を持たないCartモデルをシリアル化しようとしていることは明らかです。あなたはそのアプローチについて考え直すべきです。 Web APIの開発を自動化するためのhttp://www.apimonk.com/を参照してください。 – Amar