【问题标题】:Remove specific object from Many-to-many relationship从多对多关系中删除特定对象
【发布时间】:2021-09-04 09:02:53
【问题描述】:

我有两个模型:

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

【问题讨论】:

  • 您的产品需要一个主键。我也不清楚你为什么使用b = b.items...
  • @WillemVanOnsem 我用 pk 成功了,谢谢

标签: django django-models django-views many-to-many


【解决方案1】:

您要删除的对象应该有一个主键,或者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')

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

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

【讨论】:

    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多