简体   繁体   中英

How to add to cart drf

I have already asked this question but I got no response can you please elaborate how should I proceed. I am trying to create the order but i stuck at logic.

models.py:

class OrderItem(models.Model):
      image_number = models.CharField(max_length=20)
      title = models.CharField(max_length=20)
      image_size = models.CharField(max_length=50)
      file_type = models.CharField(max_length=20)
      price = models.CharField(max_length=50)

      def __str__(self):
          return self.title


class Order(models.Model):
      user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
      items = models.ManyToManyField(OrderItem)
      start_date = models.DateTimeField(auto_now_add=True)
      ordered_date = models.DateTimeField()
      ordered = models.BooleanField(default=False)

      def __str__(self):
          return str(self.user)

serializers.py:

class AddtocartSerializers(serializers.ModelSerializer):
      class Meta:
            model = OrderItem
            fields = ['image_number','title','image_size','file_type','price']



class CartSerializers(serializers.ModelSerializer):   
      class Meta:
           model = Order
           fields = ['item',
                     'start_date',
                     'ordered_date'
              ]

views.py:

class AddtocartView(generics.CreateAPIView):
      authentication_classes = []
      permission_classes = []
      pagination_class = None
      queryset=OrderItem.objects.all()
      serializer_class = AddtocartSerializers


class CartView(generics.ListCreateAPIView):
      authentication_classes = []
      permission_classes = []
      pagination_class = None
      queryset=Order.objects.all()
      serializer_class = CartSerializers

      def create(self, request):        
          return super(AddtocartView, self).create(request, *args, **kwargs)

urls.py:

path('addtocart/',views.AddtocartView.as_view(),name='addtocart'),
path('cart/',views.CartView.as_view(),name='cart'),

how can i create order after addtocart?

First of my suggestion for you don't to use ModelViewSet, because all you need is create and update for you view, for create use CreateAPIView, for update RetrieveAPIView. you code will be like below:

class OrderItemSerializer(serializers.ModelSerializer)
    class Meta:
        model = OrderItem
        fields = ['id', 'image_number', 'image_size', 'file_type', 'price']

class OrderCreateSerializer(serializers.ModelSerializer)
    user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
    items = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=OrderItem.objects.all(), required=True), required=True)
    ordered_date = serializers.DateField()

    class Meta:
        model = Order
        fields = ['user', 'items', 'ordered_date']

    def create(self, validated_data):
        validated_data['user'] = self.context['request'].user 
        instance = Order.objects.create(**validated_data)
        instance.save()
        return instance


class CartView(CreateAPIView):
      authentication_classes = []
      queryset=Order.objects.all()
      serializer_class = OrderCreateSerializer

      def create(self, request):
          return super(AddtocartView, self).create(request, *args, **kwargs)

ModelViewSet include more code which you don't use in you case. And also you can get user from request, and you can just add

validated_data['user'] = self.context['request'].user

Yes you can do a post request to addtocart endpoint. But there must be logic written in addtocart endpoint to create an order and add OrderItem to the order. Then the order number must be returned to browser so that user can resume shopping / checkout the order.

After receiving the order number you can do some javascript stuff to show user his order details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM