Ошибка ограничения Django FOREIGN KEY

Мое приложение - это корзина для покупок. У меня есть функция в 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 обеспечивает поддержку многоязычных приложений и сайтов.


1 559
3

Ответы:

Проблему можно решить примерно так:

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)

У меня сработало с аналогичной проблемой.