【问题标题】:How to update data in django rest framework如何在 django rest 框架中更新数据
【发布时间】:2020-08-14 07:35:45
【问题描述】:

我有一个购物车模型,我希望在 API 中,如果用户在购物车中添加两次相同的商品,购物车将自动增加服务数量。就我而言,如果我两次添加相同的商品,它会创建另一个购物车,而不是更新前一个购物车。我搜索了很多,但我没有得到答案。我尝试了很多来做到这一点。如果有人能够给出答案,请给出答案,请
这是我的代码:-

views.py

class CartViewSet(viewsets.ModelViewSet):
    serializer_class = CartSerializer
    permission_classes = (IsAuthenticated,)
    def get_queryset(self):
        user = self.request.user
        if user.is_authenticated:
            if user is not None:
                if user.is_active and user.is_superuser or user.is_Customer:
                    return Cart.objects.all()
                raise PermissionDenied()
            raise PermissionDenied()
        raise PermissionDenied()
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['date_created', 'user']
    @action(detail=False)
    def count(self, request):
        queryset = self.filter_queryset(self.get_queryset())
        count = queryset.count()
        content = {'count': count}
        return Response(content)

serializers.py

class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = ['id','url', 'user', 'service', 'defects', 'date_created', 'quantity' , 'price', 'total']

models.py

class Cart(models.Model):
    user = models.ForeignKey('accounts.User', related_name="carts", null=True, on_delete=models.SET_NULL)
    quantity = models.IntegerField(default=1)
    service = models.ForeignKey('accounts.SubCategory',null=True,  on_delete=models.SET_NULL)
    defects = models.ForeignKey('Defects',null=True,  on_delete=models.SET_NULL)
 
    price = models.IntegerField(default=False)
    date_created = models.DateTimeField(auto_now_add=True)
    total = models.IntegerField(blank=True, null=True)    

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

【问题讨论】:

  • 看不到实际增加数量的代码。可以加一下吗?
  • 兄弟,没有代码可以增加数量
  • 请给我建议增加数量的代码

标签: python django django-rest-framework django-views django-serializer


【解决方案1】:

您必须覆盖 CartSerializer 中的 create 方法,如果已经创建,您可以检查和更新。我会提到一些与此相关的东西

覆盖创建方法

class CartSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cart
        fields = ['id','url', 'user', 'service', 'defects', 'date_created', 'quantity' , 'price', 'total']

    def create(self,validated_data):
        """ Create cart if not created """
        cart,created = Cart.objects.get_or_create(**validated_data)
        if not created:
           cart.quantity=cart.quantity+1
        # you have to write your own logic i give you just an hint 
        return cart

在这里,我们覆盖了它在每当我们在购物车 URL 上发布请求时调用的 create 方法,此时我们可以更改创建购物车对象的流程

希望您理解,如果您有任何疑问,请告诉我

【讨论】:

  • 兄弟,这不起作用,如果我在购物车中添加两次相同的商品,它会创建 2 个购物车,我只想要一个数量为 2 的购物车
  • 我告诉你必须遵循的方式我无法给你完整的逻辑,因为我不知道你在这些东西和任何模型中使用的外国人模型,所以我在答案中也提到了你必须在您的序列化程序中覆盖 create 方法,并且我告诉您它绝对可以在这里工作 不要在 create 方法中复制确切的代码应用逻辑并返回购物车对象
  • 兄弟,请告诉我如何使用这就是我的购物车代码
【解决方案2】:

我发现了一些最佳实践,下面我将展示如何使用基于函数的视图更新 API 的通用方法,该视图可与类基视图一起使用。 *** 笔记 您必须有一些 id 或唯一字段来识别 JSON 有效负载中的对象

Models.py 
 class Product(models.Model):
   actual_product_id=models.Autofield(primary_key=True,auto_created=True)
   price ....
   etc

Serializers.py

from .import Product
class Product_Serializers(models.ModelSerializer):
   class Meta:
     model=Product
     fields='__all__'

Raw Json format which will bw received by api 
{  "some_product_id":"4163",
   "price ": "41"
}
Urls.py

from django.conf.urls import url 

url(r'^/api/productview',views,productview),

Views.py 

@api_view(['PUT','GET','POST'])


def productview(request):
    json_response=JSONParser().parse(request)
        
        if "some_product_id" in json_response:
            doctor_requested_id=json_response['some_product_id']
     
            verified_object=Product.objects.filter(
            some_product_id=actual_product_id)

            verified_object.update(**json_response)
            return JsonResponse({'message':"product has been updated 
              succesfully"},status=status.HTTP_200_OK)
        else :
            return JsonResponse({'message':"product's id dosen't exist"})

希望它能解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2018-02-14
    • 1970-01-01
    • 2015-01-17
    • 2019-03-05
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多