Логика работы заказа и корзины django
Вопрос чисто логики работы (без кода). Например у нас есть корзина привязанная к пользователю
class Cart(models.Model):
""" Корзина """
profile = models.ForeignKey(Profile, on_delete=models.CASCADE, verbose_name='Покупатель')
products = models.ManyToManyField('CartProduct', blank=True, related_name='related_cart')
final_price = models.IntegerField(default=0, verbose_name='Общая цена')
def __str__(self):
return str(self.id)
class Meta:
verbose_name = 'Корзина'
verbose_name_plural = 'Корзины'
class CartProduct(models.Model):
""" Объект корзины """
profile = models.ForeignKey(Profile, on_delete=models.CASCADE, verbose_name='Покупатель')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=1, blank=True)
final_price = models.IntegerField(verbose_name='Общая цена', blank=True)
def save(self, *args, **kwargs):
self.final_price = self.quantity * self.product.price
super().save(*args, **kwargs)
def __str__(self):
return "Объект: {} (для корзины)".format(self.product.title)
class Meta:
verbose_name = 'Объект корзины'
verbose_name_plural = 'Объекты корзины'
class Order(models.Model):
""" Заказ """
profile = models.ForeignKey(Profile, on_delete=models.CASCADE, verbose_name='Покупатель')
products = models.ManyToManyField('OrderItem', blank=True, related_name='related_order')
billid = models.CharField(max_length=200)
comment = models.TextField(default='BagleyEcommerce')
final_price = models.IntegerField(default=1)
paid = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.id)
class Meta:
verbose_name = 'Заказ'
verbose_name_plural = 'Заказы'
class OrderItem(models.Model):
""" Предмет заказа """
profile = models.ForeignKey(Profile, on_delete=models.CASCADE, verbose_name='Покупатель')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=1, blank=True)
final_price = models.IntegerField(verbose_name='Общая цена', blank=True)
def save(self, *args, **kwargs):
self.final_price = self.quantity * self.product.price
super().save(*args, **kwargs)
def __str__(self):
return "Объект: {} (заказ)".format(self.product.title)
class Meta:
verbose_name = 'Объект заказа'
verbose_name_plural = 'Объекты заказа'
Вопрос: можно ли привязать order сразу к корзине? Или человек нажал кнопку оплатить (создался order привязанный к корзине) после человек добавил к корзине еще товара и оплатил. После покупки ему выдадут товар который в корзине (был до оплаты или после?) Или тогда нужно дублировать заказ в order как у меня?
Если не понятно пишите в комментарии, постараюсь ответить.
Ответы (1 шт):
я тоже когда то писал интернет-магазин книг, но так и не дописал его.
Сделал только возможность покупки товара не зарегистрированным пользователем.
вот мой репозиторий, может поможет чем https://github.com/ZheniaGreenTea/online-store
там корзина описана не как модель, а вынесена в отдельный файл services.py
Даже помню, что пришлось учить основы джава скрипта, чтобы добавление и удаление товара происходило красиво без перезагрузки страницы.
Вот этот классный вопрос ты задал "После покупки ему выдадут товар который в корзине (был до оплаты или после?)". Это наталквает к тому, что должна быть продумана система оплаты: онлайн картой, доставка почтой, курьером, самовывоз. И раз так в ордере должен быть также статусы заказа: оплачен, ожидает оплаты, не оплачен, доставленю.
По поводу "Или тогда нужно дублировать заказ в order как у меня?". Вообще идея тоже здравая. Мой преподаватель настаивал, чтобы сделать копию ордера, потому что когда то ему привезли не тот товар который он заказывал. Изменили описание товара на сайте и ему пришлось вытаскивать старую страничку из кеша, чтобы доказать, что описание товара на сайте было изменен уже после покупки.