簡體   English   中英

Django pre_save,實例為無

[英]Django pre_save, instance is None

我正在編寫 pre_save 方法來為 model 創建 slug,由於某種原因,我的實例沒有。

@receiver(pre_save, sender=Employee)
def pre_save_employee_receiver(sender, instance, *args, **kwargs):
    slug = slugify(" ".join([instance.name, instance.surname, instance.id]))
    instance.slug = slug

錯誤是:

File "E:\Work\hire_handler\employees\models.py", line 60, in pre_save_employee_receiver
    slug = slugify(" ".join([instance.name, instance.surname, instance.id]))
TypeError: sequence item 2: expected str instance, NoneType found

instance不是None主鍵instance.id )是None

這很有意義,在數據庫端創建 object 之前,該項目沒有主鍵,因為數據庫調度了一個主鍵。

因此,如果您想使用主鍵,則需要使用post_save項,而且id很可能是一個 int,所以它仍然不起作用,因為' '.join()不能連接整數。

您可以使用post_save觸發器,然后再次保存,但這將導致在創建新Employee時進行兩次查詢:

@receiver(post_save, sender=Employee)
def post_save_employee_receiver(sender, instance, created, *args, **kwargs):
    if created:
        instance.slug = slugify(f'{instance.name} {instance.surname} {instance.pk}')
        instance.save()

此外,信號通常有點反模式,尤其是當您執行.bulk_create().update()等時,信號不會被觸發。

暫無
暫無

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

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