簡體   English   中英

Django - 如何在 ManyToMany 關系中使用 delete() 來只刪除一個關系

[英]Django - How to use delete() in ManyToMany relationships to only delete a single relationship

我有一個可以分配給多個users的模型Voucher

我為此使用了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'),

使用.remove方法。 請參閱 M2M 文檔。

所以

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對象不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM