Django Объект ManyToManyField автоматически сохраняет себя - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь создать сайт электронной коммерции, используя Django. У меня есть orderProducts как поле ManyToMany для объекта корзины. Вопрос в том, почему всякий раз, когда я создаю объект OrderProduct, любая существующая корзина автоматически сохраняет OrderProduct в себе. Вот моя модель:

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    post_date = models.DateTimeField('post date:', default=timezone.now)

    def __str__(self):
        return self.name

    def add_to_cart_url(self):
        return reverse("add_to_cart", kwargs={
            'product_id' : self.pk
        })


class OrderProduct(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return self.product.name

    def delete_from_cart_url(self):
        return reverse("delete_from_cart", kwargs={
            'product_name' : self.product.name
        })


class Cart(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    products = models.ManyToManyField(OrderProduct)

    def __str__(self):
        return self.user.username

Это функция add_to_cart, даже когда я закомментировал код cart.products.add, OrderProduct все еще добавляется в корзины.

def add_to_cart(request,product_id):
    product = get_object_or_404(Product,pk=product_id)
    order_product,created = OrderProduct.objects.get_or_create(product=product,user=request.user)
    cart_qs = Cart.objects.filter(user=request.user)
    if cart_qs.exists():
        cart = cart_qs[0]
        if cart.products.filter(product__name=product.name).exists():
            order_product.quantity += 1
            order_product.save()
        else:
            return redirect("cart")
            #cart.products.add(order_product)
        return redirect("cart")
    else:
        cart = Cart.objects.create(user=request.user)
        #cart.products.add(order_product)
        return redirect("products")

Это вид корзины

@login_required(login_url='/login/')
def cart(request):
    # order_product_list = OrderProduct.objects.order_by('-product__price')
    cart,created = Cart.objects.get_or_create(user=request.user)
    order_product_list = cart.products.all()
    order_product_list = OrderProduct.objects.order_by('-product__price')
    total = 0
    for order_product in order_product_list:
        total += order_product.product.price * order_product.quantity

    context = {
        'products' : order_product_list,
        'total' : total,
    }

    return render(request,'login/cart.html',context)

1 Ответ

0 голосов
/ 08 января 2020

Правильно, ваша ошибка здесь

order_product_list = OrderProduct.objects.order_by('-product__price')

Там вы переопределяете список своих продуктов всеми OrderProduct независимо от того, принадлежат они к текущей корзине или нет.

Вместо этого ты должен делать

order_product_list = cart.products.order_by('-product__price')
...