Сигналы Django, применяемые на листе сохранения - PullRequest
1 голос
/ 31 декабря 2010

Мне трудно понять, как работают сигналы, я пролистал несколько страниц, но ни одна из них не помогла мне получить картину.

У меня есть две модели, я хотел бы создать сигнал, который будет сохраняться в дочерней модели при сохранении записи в родительской модели. На самом деле, я хочу, чтобы ребенок слушал через мое приложение любого родителя, начиная с этого ребенка, в частности универсального внешнего ключа.

ядро ​​/ models.py

from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Audit(models.Model):
    ## TODO: Document
    # Polymorphic model using generic relation through DJANGO content type
    operation  = models.CharField(max_length=40)
    operation_at = models.DateTimeField("Operation At", auto_now_add=True)
    operation_by = models.ForeignKey(User, db_column="operation_by", related_name="%(app_label)s_%(class)s_y+")
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

рабочий / models.py

from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from core.models import Audit


class Instances(models.Model):
    ##  TODO: Document
    ##  TODO: Replace id with XXXX-XXXX-XXXX-XXXX
    # Re
    INSTANCE_STATUS = (
        ('I', 'In Progress' ),
        ('C', 'Cancelled'   ),
        ('D', 'Deleted'     ),
        ('P', 'Pending'     ),
        ('O', 'Completed'   )
    )

    id=models.CharField(max_length=200, primary_key=True)
    status=models.CharField(max_length=1, choices=INSTANCE_STATUS, db_index=True)
    audit_obj=generic.GenericRelation(Audit, editable=False, null=True, blank=True)


    def save(self, *args, **kwargs):
        # on new records generate a new uuid
        if self.id is None or self.id.__len__() is 0:
            import uuid
            self.id=uuid.uuid4().__str__()
        super(Instances, self).save(*args, **kwargs)



class Setup(models.Model):
    ## TODO: Document
    # Polymorphic model using generic relation through DJANGO content type
    content_type=models.ForeignKey(ContentType)
    object_id=models.PositiveIntegerField()
    content_object=generic.GenericForeignKey('content_type', 'object_id')


class Actions(models.Model):
    ACTION_TYPE_CHOICES = (
        ('P', 'Python Script'),
        ('C', 'Class name'),
    )
    name=models.CharField(max_length=100)
    action_type=models.CharField(max_length=1, choices=ACTION_TYPE_CHOICES)


class Tasks(models.Model):
    name=models.CharField(max_length=100)
    Instance=models.ForeignKey(Instances)

Я пытаюсь создать прослушиватель в модели Audit, чтобы я мог связать его с моделью Instance. Если новая запись вставлена ​​в Instance, она автоматически вставит и запись в Audit. Затем я планирую подключить этот слушатель к нескольким моделям в моем приложении,

Есть идеи, как я могу это сделать?

1 Ответ

4 голосов
/ 31 декабря 2010

С помощью приведенного ниже кода вы можете связать сохранение объекта Instance с методом after_save_instance_handler. В этом методе вы создаете отношение к Аудиту. Пожалуйста, смотрите также общие отношения документ

Я обычно добавляю сигналы в models.py, где был определен отправитель. Не уверен, если это необходимо.

from django.db.models.signals import post_save

#####SIGNALS######
def after_save_instance_handler(sender, **kwargs):
    #get the saved instance
    instance_object = kwargs['instance']

    #get the needed data
    the_date = ...
    the_user = ...
    the_object_id = ...

    #create the relation to the audit object
    instance_object.audit_obj.create(operation="op963",operation_at=the_date,operation_by=the_user,object_id=the_object_id)

#connect the handler with the post save signal - django 1.1 + 1.2
post_save.connect(after_save_instance_handler, sender=Instances)

Джанго 1,2 сигнала

в версии для разработки django добавлен декоратор для подключения сигнала. таким образом, вместо вызова выше вы должны добавить этот декоратор в обработчик

@receiver(post_save, sender=Instances)
def after_save_instance_handler(sender, **kwargs):

сигналы разработчиков Django

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