2017-11-06 2 views
1

DRF가있는 API를 작성하여 장바구니를 보려고합니다. 비 API 버전에서 작동하지만 serializer에서 필드가 모델에 존재하지 않는 오류가 발생합니다.외장 키가있는 모델 용 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', 
       ] 

이 오류가 발생합니다 필드 이름 titleCart 모델에는 유효하지 않습니다.

템플릿보기에는 항목이 표시되지만 API보기에는 표시되지 않습니다. 그래서 내가 여기서해야 할 일은 뭐니?

+0

장바구니 모델에는 제목이라는 제목이 없으므로 오류가 발생합니다. 어쩌면 오류가 있고 serializer 클래스에서 model = Cart (Meta 서브 클래스에서) 대신 model = Product를 사용해야합니다. 나는 그 문제를 해결할 것이라고 생각한다. –

+0

get_queryset() 메소드는 queryset 객체를 반환해야한다. – Amar

+0

제목 특성이없는 장바구니 모델을 serialize하려는 동안이 오류가 분명합니다. 접근법에 대해 다시 생각해 봐야합니다. 웹 API 개발 자동화를위한 http://www.apimonk.com/ – Amar

답변

0

장바구니 모델에 필드 또는 방법 Title이 없지만 필드 목록에 포함 시켰습니다. 모델에 존재하는 필드 나 메소드 또는 명시 적 링크를 생성하는 메소드 만 직렬화 할 수 있습니다.

orders = Order.objects.filter(cart=cart)을 전달하면 템플릿에 제품 제목이 표시됩니다. Order 템플릿에 표시되는 개체 문자열 메서드는 return self.product.title이므로 주문 개체에서 해당 제품 (조인)으로 이동하고 해당 개체의 제목 특성을 가져옵니다.

serializer에서 동일한 작업을 수행하려면 각 개체에 대한 serializer를 정의한 다음 중첩해야합니다.

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

나머지 serializers를 보지 않고도 자신이 한 일을 말하기는 어렵습니다. 그러나 제공된대로 CartSerializer는 절대로 작동하지 않습니다. 당신은 그 분야가 없습니다. – Withnail

+0

또한 동일한 오류가 발생하는 경우 필드 목록에서 '제목'을 제거하지 않았습니다. – Withnail