Работа с сигналом Джанго post_save () - PullRequest
4 голосов
/ 29 марта 2011

У меня есть две таблицы:

class Advertisement(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    author_email = models.EmailField()

class Verification(models.Model):
    advertisement = models.ForeignKeyField(Advertisement)
    key = models.CharField(max_length=32)

И мне нужно автоматически заполнить таблицу верификации после добавления нового объявления.

def gen_key(sender, instance, created, **kwargs):
    if created:
        from hashlib import md5
        vkey = md5("%s%s" % (instance.author_email, instance.created_at))
        ver = Verification(advertisement=instance)
        ver.key = vkey
        ver.save()

post_save.connect(gen_key, sender=Advertisement)

Конечно, это не работает. Джанго 1.2 В: Как мне это сделать?


Хорошо, наполовину решено.
Проблема в том, что post_save () для родительской модели не вызывает дочерние модели.
Таким образом, вы можете решить эту проблему, предоставив дочерний класс напрямую.

class Advertisement(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    author_email = models.EmailField()

class Sale(Advertisement):
    rooms = models.IntegerField(max_length=1)
    subway = models.ForeignKey(Subway)

class Verification(models.Model):
    advertisement = models.ForeignKeyField(Advertisement)
    key = models.CharField(max_length=32)

def gen_key(sender, instance, created, **kwargs):
    code goes here
post_save.connect(gen_key, sender=Sale, dispatch_uid="my_unique_identifier")

Итак, следующий вопрос: «Как я могу использовать родительский класс для post_save ()?»

1 Ответ

4 голосов
/ 26 августа 2011

вместо подключения к определенному отправителю, просто подключитесь к post_save в общем и проверьте класс сохраненного экземпляра в вашем обработчике, например

def gen_key(sender, **kwargs):
    if issubclass(sender, Advertisement):
        code goes here
post_save.connect(gen_key, dispatch_uid="my_unique_identifier")
...