Как сделать (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()
Вернуться на верх