#python #django #api #django-rest-framework #django-serializer
#python #django #API #django-rest-framework #django-сериализатор
Вопрос:
У меня есть CartModel, модель CartItem. Я пытаюсь сделать, когда я создаю корзину, и когда корзина создается, и снова я добавляю те же данные, которые я ввожу в pervious, чтобы создать другую корзину. Я пытаюсь сделать это, если корзина существует в таблице 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
Ответ №1:
Вы можете использовать unique=True
в своей модели CartItem. Если вы попытаетесь сохранить повторяющееся значение с этим, django выдаст сообщение об ошибке.
cart = models.ForeignKey('CartModel', on_delete=models.CASCADE, unique=True)
Комментарии:
1. нет, братан, я не хочу такого, я хочу, чтобы, если пользователь снова отправит те же данные, он вернет ответ «корзина уже существует»
2. с помощью try / except вы можете «поймать» ошибку и распечатать («корзина уже существует»). это то, что вы хотите, верно?
3. Да, мне это не нравится. Не могли бы вы мне помочь??
4. вы пытались добавить «unique = True» и уже перехватили ошибку?