【问题标题】:How to check if data exists or not in Django rest framework如何在Django rest框架中检查数据是否存在
【发布时间】:2020-12-16 14:49:37
【问题描述】:

我有一个 CartModel、CartItem 模型。我在创建购物车时尝试做,当购物车被创建时,我再次添加与我输入相同的数据,它会创建另一个购物车。 我试图这样做,如果购物车存在于 CartItem 表中,它必须显示响应“购物车已经存在”。 但它正在创建另一个购物车。我搜索了很多并使用了代码,但它不会运行。 如果有人能够给出答案,请帮助我。

views.py*

class CartTestViewSet(viewsets.ModelViewSet):
    serializer_class = CartItemSerializer
    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 CartItem.objects.all()
                raise PermissionDenied()
            raise PermissionDenied()
        raise PermissionDenied()

    def post(self, request):       
        cart = Cart.objects.filter(user=request.user, cart=request.data, service=request.data, defects=request.data)
        if cart.exists():   
            print('cart already exists')
        else:
            print('cart is created')

serializers.py

from rest_framework import serializers
from .models import CartItem, CartModel
from rest_framework.response import Response

class CartItemSerializer(serializers.ModelSerializer):
    def get_total(self, obj):
        return obj.get_total
    get_total = serializers.IntegerField(read_only=True, required=False)
    # id = serializers.IntegerField(read_only=False)
    class Meta:
        model = CartItem
        fields = "__all__"
        extra_fields = ['get_total']
        read_only = ['get_total']

class CartModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = CartModel
        fields = "__all__"

models.py

from django.db import models
from accounts.models import User, SubCategory
from category.models import Defects
from django.utils import timezone
# Create your models here.

class CartModel(models.Model):
    user = models.ForeignKey('accounts.User', on_delete=models.CASCADE)
    status_choice = [
        ('1', 'open'),
        ('2', 'closed')
    ]
    status = models.CharField(max_length=2, choices=status_choice, default=1)
    
    def __str__(self):
        return self.user.username
    
class CartItem(models.Model):
    cart = models.ForeignKey('CartModel', on_delete=models.CASCADE)
    user = models.ForeignKey('accounts.User', on_delete=models.CASCADE)
    service = models.ForeignKey('accounts.SubCategory', on_delete=models.CASCADE)
    defects = models.ForeignKey('category.Defects', on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    price = models.IntegerField()
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        total = int(self.quantity) * int(self.price)
        return str(total)

    
    def get_total(self):
        total = int(self.quantity )* int(self.price)
        return total

【问题讨论】:

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


    【解决方案1】:

    您可以在 CartItem 模型中使用 unique=True。 如果你试图用这个保存一个重复的值,django 会报错。

    cart = models.ForeignKey('CartModel', on_delete=models.CASCADE, unique=True)
    

    【讨论】:

    • 不,兄弟,我不想这样,如果用户再次发布相同的数据,我希望它返回响应“购物车已经存在”
    • 使用 try/except 您可以“捕获”错误并打印(“购物车已存在”)。这就是你想要的吗?
    • 是的,我喜欢这个。你能帮帮我吗??
    • 您是否尝试添加“unique=True”并已捕获错误?
    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2018-05-01
    • 2022-01-16
    相关资源
    最近更新 更多