Django pre_save, экземпляр None - PullRequest
0 голосов
/ 28 мая 2020

Я пишу метод pre_save для создания слага для модели, по какой-то причине мой экземпляр отсутствует.

@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

1 Ответ

0 голосов
/ 28 мая 2020

Нет , instance не None, первичный ключ (instance.id) равен None.

Это имеет смысл , перед созданием объекта на стороне базы данных элемент имеет no первичный ключ, поскольку база данных отправляет первичный ключ.

Таким образом, если вы хотите работать с первичным ключом, вам необходимо работать с элементом post_save, более того, вероятно, что id - это int, поэтому он все равно не будет работать, поскольку ' '.join() не может объединять целые числа.

Вы можете использовать триггер post_save, и сохраните его еще раз, но это приведет к созданию двух запросов при создании нового Employee:

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

Кроме того, сигналы обычно немного антипаттерны , особенно если вы например, выполните .bulk_create(), .update(), и т. д. c. сигналы не срабатывают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...