2017-11-06 24 views
1

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ビューには表示されません。それで私はここで何をすべきか?

+0

カートのモデルにはタイトルというタイトルのフィールドがないため、エラーが発生します。エラーがありシリアライザクラスにあり、model = Cart(Metaサブクラスで)の代わりにmodel = Productを使うべきでしょう。私はそれが問題を解決すると思う –

+0

私が推測するquerysetオブジェクトを返すget_queryset()メソッドを参照してください。 – Amar

+0

このエラーは、タイトル属性を持たないCartモデルをシリアル化しようとしていることは明らかです。あなたはそのアプローチについて考え直すべきです。 Web APIの開発を自動化するためのhttp://www.apimonk.com/を参照してください。 – Amar

答えて

0

カートのモデルにはフィールドまたは方法Titleはありませんが、フィールドリストに追加しました。モデルに存在するフィールドまたはメソッド、または明示的なリンクを作成する場合にのみ、シリアル化できます。

orders = Order.objects.filter(cart=cart)を返信しているため、テンプレートに商品タイトルが表示されます。 Orderオブジェクト文字列メソッドは、テンプレートに表示されているもので、return self.product.titleです。つまり、注文オブジェクトから対応する製品(結合)に移動し、そのオブジェクトのタイトル属性を取得します。

シリアライザでも同じことを行うには、各オブジェクトにシリアライザを定義してからネストします。

class CartSerializer(ModelSerializer): 
    class Meta: 
     model = Cart 
     fields = [ 
        'title', 
        'cover_image', 
        'summary', 
        'price', 
       ] 

class ProductSerializer(ModelSerializer): 
     class Meta: 
      model = Product 
     ...etc... 

class OrderSerializer(ModelSerializer): 
    class Meta: 
      model = Order 
    product = ProductSerializer 
    ...etc... 
+0

私は(http://www.django-rest-framework.org/api-guide/relations/#nested-relationships)このリンク。それでも同じエラーが発生します。 –

+0

残りのシリアライザを見ずに、あなたがしたことを言うのは難しいです。しかし、提供されるように、CartSerializerは決して動作しません。あなたはその分野を持っていません。 – Withnail

+0

また、同じエラーが発生した場合は、フィールドリストから「タイトル」を削除していません。 – Withnail

関連する問題