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



我有两种型号:

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 =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')

您可以通过直接处理直通模型来防止从数据库中获取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')

最新更新