从多对多关系中删除特定对象

Remove specific object from Many-to-many relationship

我有两个模型:

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 %}

您要删除的对象应该有一个主键,或者 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 = <b>get_object_or_404(</b>Product, product_url=product_url<b>)</b>
        b = <b>get_object_or_404(</b>Discount, id=id<b>)</b>
        b.items.remove(a)
        return redirect("/staff/discount/"+id)
    else:
        return redirect('/staff')

您可以通过直接处理直通模型来阻止从数据库中获取折扣对象:

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.<b>through.objects.filter(</b>discount_id=id, product=a<b>)</b>
        b.items.remove(a)
        return redirect("/staff/discount/"+id)
    else:
        return redirect('/staff')