从多对多关系中删除特定对象
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')
我有两个模型:
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')