【问题标题】:Django - How to use delete() in ManyToMany relationships to only delete a single relationshipDjango - 如何在 ManyToMany 关系中使用 delete() 来只删除一个关系
【发布时间】:2022-12-22 21:48:42
【问题描述】:

我有一个模型Voucher,可以分配给多个users

我为此使用了M2M关系。

我希望在模板中删除分配给登录用户的凭证,并且仅登录用户(不是所有关系)。

我遇到的问题是当前模型为所有用户删除了整个模型,而不是单个用户请求“删除”。

另一种选择显然是简单地在 ForeignKey 上创建一个模型 Voucher,但有些事情告诉我我可能可以在视图中使用 M2M 来做到这一点。

有没有办法让我的删除功能针对特定用户?在下面的示例中,我尝试基于 user.request 进行过滤,但它不起作用。查看模型中的数据,列出了用户 ID。这不是request.user 做的吗?

楷模

class Voucher(models.Model):
    user = models.ManyToManyField(User, blank=True)

观点

def delete_voucher(request, voucher_id):
    voucher = Voucher.objects.filter(pk=voucher_id).filter(user=request.user)
    voucher.delete()
    return redirect('account')

模板

<a class="button3 btn-block mybtn tx-tfm" href="{% url 'delete-voucher' voucher.id %}">Delete</a>

网址

path('delete_voucher/<voucher_id>', views.delete_voucher, name='delete-voucher'),

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

    使用 .remove 方法。 See the M2M documentation.

    所以

    def delete_voucher(request, voucher_id):
        voucher = Voucher.objects.filter(pk=voucher_id).filter(user=request.user)
        voucher.user.remove( request.user)
        return redirect('account')
    

    它是对称的,所以你也可以这样做request.user.voucher_set.remove( voucher)

    知道有一个中间表维护 voucher 对象(vouchers 表中的行)和 user 对象之间的关系可能会有所帮助。此表中的每一行都包含一个指向 user 的外键和一个指向 voucher 的外键。 .remove 删除此中间表中的行,保留uservoucher 对象不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2012-03-14
      • 2023-01-27
      • 2012-03-10
      相关资源
      最近更新 更多