Мое приложение - это корзина для покупок. У меня есть функция в views.py, которая запускается, когда кто-то добавляет товар в корзину. Функция проверяет, есть ли у пользователя активный заказ (тот, который находится в корзине, но не оплачен). Но код не работает в `user_order, status = Order.objects.get_or_create (owner = user_profile, is_ordered = False)
@login_required()
def add_to_cart(request, **kwargs):
#get the user profile
user_profile = get_object_or_404(UserProfile, user=request.user)
#filter products by id
producto = Producto.objects.filter(id=kwargs.get("pk", "")).first()
#create OrderItem, of the selected product
order_item, status = OrderItem.objects.get_or_create(producto=producto)
if status == False: #adds one to the order_item
order_item.quantity += 1
order_item.save()
print(order_item.quantity)
#create order associated with the user
user_order, status = Order.objects.get_or_create(owner=user_profile, is_ordered=False)
user_order.items.add(order_item)
#print(user_order.items.all()) #queries the items
#print(user_order)
#date is not beign added
# generate a reference code
user_order.ref_code =random.randint(0,100000)
user_order.save()
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
Соответствующие модели:
class Order(models.Model):
fecha_reparto = models.OneToOneField(DiasDeReparto, on_delete=models.CASCADE, default= 1)
order_nodo = models.OneToOneField(Nodo, on_delete=models.CASCADE, default= 1)
ref_code = models.CharField(max_length=15)
owner = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
is_ordered = models.BooleanField(default=False)
items = models.ManyToManyField(OrderItem)
date_ordered = models.DateTimeField(null=True)
def get_cart_items(self):
return self.items.all()
def get_cart_total(self):
return sum([item.producto.precio * item.quantity for item in self.items.all()])
def __str__(self):
return self.ref_code
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class OrderItem(models.Model):
producto = models.OneToOneField(Producto, on_delete=models.SET_NULL, null = True)
quantity = models.IntegerField(default=1)
is_ordered = models.BooleanField(default=False)
date_added = models.DateTimeField(auto_now = True)
date_ordered = models.DateTimeField(null=True)
def __str__(self):
return self.producto.nombre
🤔 А знаете ли вы, что...
Django обеспечивает поддержку многоязычных приложений и сайтов.
Проблему можно решить примерно так:
try:
Order.objects.get(owner=user_profile)
except:
Order.objects.create(fecha_reparto=dia_reparto[0], order_nodo=nodo[0], ref_code = "asdas", owner=user_profile, is_ordered=False, date_ordered=datetime.datetime.now())
Но я не понимаю, почему get_or_create не работает
В вашей модели Order у вас есть несколько связанных полей модели, а в get_or_create вы не указываете никаких значений по умолчанию. Для получения или создания требуются необходимые значения для ввода при создании, и у вас есть несколько обязательных связанных полей. Это также объяснит, почему try и except работают, потому что вы добавляете поля при создании в except.
defaults = {fecha_reparto: dia_reparto[0], order_nodo: nodo[0]......}
user_order, status = Order.objects.get_or_create(owner=user_profile, is_ordered=False, defaults=defaults)
Используйте id
вместо экземпляра модели в этой строке:
user_order, status = Order.objects.get_or_create(owner=user_profile, is_ordered=False)
Так должно получиться так:
user_order, status = Order.objects.get_or_create(owner_id=user_profile.pk, is_ordered=False)
У меня сработало с аналогичной проблемой.