Как сделать (if & else) для внутренних значений в django orm?
Я делаю модели для своего проекта магазина и хотел узнать, почему код, который я написал, неправильный? И как я могу написать правильно? Я хочу, чтобы в базу данных записывалось только время, когда товар продан у меня.
class Product(models.Model):
product_type = models.ForeignKey(ProductType, on_delete=models.PROTECT, related_name='products_types')
upc = models.BigIntegerField(unique=True)
title = models.CharField(max_length=32)
description = models.TextField(blank=True)
category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name='products')
brand = models.ForeignKey(Brand, on_delete=models.PROTECT, related_name='products')
soled = models.BooleanField(default=False)
if soled == True:
soled_time = models.DateTimeField(auto_now_add=True)
created_time = models.DateTimeField(auto_now_add=True)
modified_time = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
Я надеюсь, что моя проблема решит вопрос многих друзей<3
Добро пожаловать в SO. Отличный вопрос, позвольте мне объяснить.
Ваша модель верна, за исключением поля soled_time
и оператора if над ним.
С учетом сказанного, я думаю, что вам не хватает логики, если только у вас не происходит что-то вроде продажи одного товара (в отличие от запасов товаров), то вам, возможно, нужно добавить еще одну модель.
В таком примере продукт, как правило, является собственной сущностью, и мы создаем вспомогательные модели с отношениями к модели продукта.
Например, у вас может быть модель Cart, которая выглядит примерно так:
class Cart(models.Model):
products = models.ManyToManyField(Product, related_name='carts_in', on_delete=models.CASCADE)
# add fk to user, so we know who ordered
# add some functions which sum the total cost of products
Надеюсь, это имеет смысл, и тогда мы перенесем поле soled_time из продуктов в Cart, потому что тогда мы знаем, когда была продана корзина, какие товары были в корзине, и какой пользователь создал корзину.
Пожалуйста, рассмотрите также существующие пакеты diango, которые управляют многими тяжелыми задачами, когда дело доходит до электронной коммерции, я бы погуглил и немного поразнюхал и посмотрел, подходит ли какой-либо из существующих пакетов для ваших нужд, большинство из них довольно расширяемы, так что вы должны быть в состоянии заставить его работать для вашего случая использования, даже если он не подходит прямо из коробки.
Если у вас есть вопросы или я могу добавить ясности к моему ответу, пожалуйста, не стесняйтесь добавить комментарий, или если это удовлетворяет ваш вопрос, то не забудьте принять этот ответ и оставить upvote, если вам нравится.
Что касается вопроса "Как мне обновить поле, когда товар продан?"
Ответ заключается в том, что вы переопределяете функцию save
модели, например, так:
class Cart(models.Model):
products = models.ManyToManyField(Product, related_name='carts_in', on_delete=models.CASCADE)
soled_time = models.DatetimeField()
# add fk to user, so we know who ordered
# add some functions which sum the total cost of products
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.sold:
self.sold_time = timezone.now()