Проверка свойств объекта на основе сепаратного представления (Django|Django-Rest-Framework)
Я использую django-rest-framework и React.js. Мне нужна отдельная функция в бэкенде для проверки, если CartItem.amount ниже, чем ProductStock.quantity, если CartItem.product равно ProductStock.id, конечно (эта часть не работает). Для той же функции мне нужно проверить, является ли ценообразование таким же, как в модели Product, но удивительно, что эта часть функции работает. Что я могу сделать, чтобы убедиться, что CartItem.amount будет снижена, если она выше, чем ProductStock.quantity?
Код ниже:
Product является чертежом для остальных моделей.
ProductStock отслеживает количество различных размеров всех товаров.
CartItem - это модель, используемая для отслеживания того, сколько товаров купил пользователь.
models.py
class Product(models.Model):
name = models.CharField(max_length=150)
price = models.IntegerField()
slug = models.SlugField(blank=True, null=True)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Product, self).save()
class ProductStock(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
size = models.CharField(max_length=6)
quantity = models.IntegerField(default=0)
def __str__(self):
return f'{self.quantity} x {self.product.name}: {self.size}'
class CartItem(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
product = models.ForeignKey(ProductStock, on_delete=models.CASCADE, blank=True, null=True)
amount = models.IntegerField(default=0, blank=True, null=True)
size = models.CharField(max_length=10, blank=True, null=True)
price = models.IntegerField(blank=True, null=True)
def __str__(self):
return f'{self.user.email}, {self.product.product.name}, {self.product.size}: {self.amount}'
def save(self, *args, **kwargs):
if self.amount > self.product.quantity:
self.amount = self.product.quantity
self.size = self.product.size
self.price = self.product.product.price
super(CartItem, self).save()
views.py
def check_cart_content(request,user_id):
cart = CartItem.objects.filter(user=user_id)
for item in cart:
product_stock = ProductStock.objects.filter(product=item.product.id)
for stock in product_stock:
if item.amount > stock.quantity:
item.amount = stock.quantity
product = Product.objects.get(id=item.product.id)
if item.price != product.price:
item.price = product.price
item.save()
return JsonResponse({'success': 'Cart checked'})
Необходимо изменить отступ JsonResponse, потому что он заканчивается после первого stock в product_stock. Также item.save() и больше, вероятно, нуждаются в изменении отступов. Пересмотрите это в чистом Python.
def check_cart_content(request,user_id):
cart = CartItem.objects.filter(user=user_id)
for item in cart:
product_stock = ProductStock.objects.filter(product=item.product.id)
for stock in product_stock:
if item.amount > stock.quantity:
item.amount = stock.quantity
product = Product.objects.get(id=item.product.id)
if item.price != product.price:
item.price = product.price
item.save()
return JsonResponse({'success': 'Cart checked'})
Вам следует подумать о перестройке дерева моделей, потому что ProductStock с ForeignKey кажется плохим решением. Было бы лучше считать в функции Product, что-то подобное:
def quantity(self):
return Product.objects.all().count()
потому что он работает динамически и вам не нужны дополнительные объекты в базе данных.