簡體   English   中英

具有ManyToMany字段的Diff Django模型對象

[英]Diff django model objects with ManyToMany fields

當數據庫中的某些內容發生更改時,我需要通知一些用戶。 我的想法是捕獲pre_savepost_save信號,並進行某種比較並將其郵寄。 通常它的效果很好,但我不知道如何獲取m2m字段的差異。

目前,我有這樣的事情:

def pre_save(sender, **kwargs):
    pk = kwargs['instance'].pk
    instance = copy.deepcopy(sender.objects.get(pk=pk))
    tracking[sender] = instance

def post_save(sender, **kwargs):
    instance = copy.deepcopy(kwargs['instance'])
    print diff(instance, (tracking[sender])) # TODO: don't print, save diff somewhere

差異函數應適用於每個模型(在mommet中,我有四個模型類)。 使用Deepcopy,我可以保存舊模型,但是我不知道如何保存m2m字段,因為它們位於單獨的表中(是的,我知道我可以獲取此數據,但是在執行時,我不知道什么字段是m2m,我不想為每個模型創建不同的廣告位)。 我想要的是通用解決方案,因此我可以稍后添加模型而無需考慮通知部分。

我的計划是在save()之后調用get_data()clear_data()函數,以清理插槽已生成的差異。

這是這樣做的好方法嗎? 有沒有更好的辦法? 有Django應用程序可以為我完成這項工作嗎?

請問我的英語不是我的母語。

首先,您不需要為此使用Deepcopy。 從數據庫中重新查詢發件人將返回一個“新”對象。

def pre_save(sender, **kwargs):
    pk = kwargs['instance'].pk
    instance = sender.objects.get(pk=pk)
    tracking[sender] = instance

您可以獲取一個類的所有多對多字段的列表,並檢查與當前實例相關的值:

for field in sender._meta.local_many:
    values = field.value_from_object(instance).objects.all()
    # Now values is a list of related objects, which you can diff

暫無
暫無

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

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