Django -如何在ManyToMany关系中使用delete()只删除一个关系

eufgjt7s  于 2022-12-24  发布在  Go
关注(0)|答案(1)|浏览(174)

我有一个模型Voucher,可以分配给几个users
我使用了M2M关系。
我希望在模板中可以删除分配给登录用户的凭证,并且仅删除登录用户(而不是所有关系)。
我遇到的问题是,当前模型为所有用户删除整个模型,而不是单个用户请求“删除”。
另一种选择显然是简单地在外键上创建一个模型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'),
biswetbf

biswetbf1#

使用.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) 
    # note, more readable if the M2M field has a plural name voucher.users
    return redirect('account')

它是对称的所以你也可以用request.user.voucher_set.remove( voucher)
知道存在一个中间表来维护voucher对象与(凭证表中的行)和一个user对象。该表中的每一行都包含一个指向user的外键和一个指向voucher的外键。.remove删除该中间表中的行。而uservoucher对象保持不变。

相关问题