1

我有两个模型:

class Product(models.Model):
product_model = models.CharField(max_length=255, default='') 
...

class Discount(models.Model):
    name = models.CharField(max_length=255, default='')
    items = models.ManyToManyField(Product, blank=True) 
    discount_percent = models.IntegerField(default=0,
        validators=[
            MaxValueValidator(100),
            MinValueValidator(1),
        ]
    )

我想从项目中删除特定项目(ManyToManyField)

我的看法:

def delete_from_discount(request, id, product_url):
    if request.user.is_staff or request.user.is_superuser:
        a = Product(product_url=product_url)
        b = Discount(id=id)
        b = b.items.remove(a)
        return redirect("/staff/discount/"+id)
    else:
        return redirect('/staff') 

没有错误,但我的模型也没有任何变化,没有删除我的 html:

{% for dis in discount.items.all %}

<a href="/staff/discount/delete-from-discount/{{discount.id}}/{{dis.product_url}}/">delet</a>
{% endfor %}
4

1 回答 1

2

您要删除的对象应该有一个主键,或者ManyToManyField是引用的字段,而不是Product没有主键的对象。

因此,您应该使用:

from django.shortcuts import get_object_or_404

def delete_from_discount(request, id, product_url):
    if request.user.is_staff or request.user.is_superuser:
        a = get_object_or_404(Product, product_url=product_url)
        b = get_object_or_404(Discount, id=id)
        b.items.remove(a)
        return redirect("/staff/discount/"+id)
    else:
        return redirect('/staff')

您可以通过直接处理 through 模型来防止从数据库中获取 Discount 对象:

from django.shortcuts import get_object_or_404

def delete_from_discount(request, id, product_url):
    if request.user.is_staff or request.user.is_superuser:
        a = get_object_or_404(Product, product_url=product_url)
        Discount.items.through.objects.filter(discount_id=id, product=a)
        b.items.remove(a)
        return redirect("/staff/discount/"+id)
    else:
        return redirect('/staff')
于 2021-06-20T11:20:02.887 回答