2010-12-31 6 views
1

信号の仕組みを理解するのが難しいですが、私はいくつかのページを調べましたが、どれも画像を取得できませんでした。保存リスト上で実装されたDjangoシグナル

私は2つのモデルを持っていますが、レコードが親に保存されるときに子モデルに保存される信号を作成したいと思います。実際には、この子は特に一般的な外部キーのため、子供が自分のアプリケーションを介してすべての親を聞いてくれるようにします。

コア/ 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にも自動的に挿入されます。次に、このリスナーを私のアプリのいくつかのモデルに接続する予定です

どうすればいいですか?

+1

ここで重要なの何にこのデコレータを追加する必要が上記の呼び出しの ?子は親に対してFKを持つので、子の 'save()'は単に親の 'save()'を呼び出すことができます。あなたはこれのための信号を必要としません。 –

答えて

4

以下のコードでは、after_save_instance_handlerメソッドを使用してInstanceオブジェクトの保存を接続できます。このメソッドでは、監査との関係を作成します。 generic relations doc

通常、送信者が定義されているmodels.pyに信号を追加します。これが必要かどうかは不明です。 Djangoの開発版で

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) 

django 1.2 signals

彼らは信号を接続するためにデコレータを追加しました。理由:これの代わりにあなたがハンドラ

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

django dev signals

+0

トム、あなたが書いたこのコードは素晴らしいです!私はすでにいくつかのモデルでそれを試して、それは完全に働いた。しかし、具体的にInstancesモデルで作業するのに問題があります。どうやら、インスタンス内でAuditクラスをインポート/使用しているため、Audit内でインスタンスをインポートしようとするとDjangoがエラーをスローします。それは私が次のエラーを取得するクラスを見ることができませんImportError:名前のインスタンスをインポートできません –

+0

あなたは歓迎です!あなたは監査でインスタンスをインポートしたいですか?これらのモデルは同じmodels.pyに配置されていますか?はいの場合、インスタンスモデルは監査後に定義されていますか?はいの場合は、私の心に来ると思います。インポートについてはわかりませんが、少なくともForeignKeyを設定すると、参照するモデルを参照モデルの上に配置する必要があります。 –

関連する問題