Django Model.object.get pre_save Странность функций - PullRequest
2 голосов
/ 31 марта 2009

Я сделал функцию, которая подключается к сигналу модели pre_save. Внутри функции я пытаюсь проверить, существует ли pk экземпляра модели в таблице с:

sender.objects.get(pk=instance._get_pk_val())

Первый экземпляр модели вызывает ошибку. Я улавливаю ошибку и генерирую поле заголовка из заголовка. Во втором случае это не выдает ошибку. Я проверил значение instance._get_pk_val () в обоих экземплярах, и они одинаковы: Нет

Итак:

# This one raises an error in the sluggit function
instance1 = Model(title="title 1")
instance1.save()

# This one doesn't raise an error
instance2 = Model(title="title 2")
instance2.save()

Это мой третий день возни с питоном и джанго. Поэтому мне жаль, если это что-то новенькое, чего я не вижу.

Редактировать:

Модель:

class Test(models.Model):
    title = models.CharField(max_length=128)
    slug = models.SlugField(max_length=128)
    slug.prepopulate_from=('title',)

signals.pre_save.connect(package.sluggit, sender=Test)

Основы функций:

def sluggit(sender, instance, signal, *args, **kwargs):
    try:
        sender.objects.get(pk=instance._get_pk_val())
    except:
        # Generate Slug Code

@S.Lot сказал мне переопределить метод save () в комментариях. Я должен попробовать это. Я все еще хотел бы знать, почему второй вызов model.objects.get () не вызывает ошибку с этим методом.

Редактировать 2 Спасибо @ S.Lot. Переопределение метода сохранения работает отлично. Все еще любопытно о методе сигнала. Хм, странно.

Редактировать 3 Поиграв немного больше, я обнаружил, что использование instance.objects.get () вместо sender.objects.get () работает:

def sluggit(sender, instance, signal, *args, **kwargs):
    try:
        sender.objects.get(pk=instance._get_pk_val())
    except:
        # Generate Slug Code

должно быть:

def sluggit(sender, instance, signal, *args, **kwargs):
    try:
        instance.objects.get(pk=instance._get_pk_val())
    except:
        # Generate Slug Code

ошибка? По какой-то причине я думал, что sender.objects.get () будет таким же, как Test.objects.get ().

Ответы [ 2 ]

1 голос
/ 31 марта 2009

S.Lott верен ... используйте save(), поскольку вы уже подтвердили, что начали.

Что касается сигнального вопроса, я честно не вижу ничего плохого в вашем коде. Я даже с успехом управлял им локально. Вы уверены, что правильно представляете это в вопросе? Или этот instance2 уже не является существующим объектом базы данных (возможно, глупостью в вашем тестовом коде)?

0 голосов
/ 24 апреля 2009

Спасибо за публикацию этого. Лучшие результаты Google (в то время, когда я публикую это) немного устарели и показывают старый способ подключения сигналов (который был недавно переписан, по-видимому). Ваши правки с исправленными фрагментами кода показали мне, как это делается.

Желаю, чтобы больше авторов отредактировали свои комментарии, чтобы исправить это. Благодарю. : -)

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