0

2 つのモデルを作成しました。

  1. Logsすべてのエントリのログを保存します。
  2. LogFeedsアクター、動詞、および日付を比較して、上記のすべてのエントリの数を取得します。

シグナルを使用して最初のモデルから 2 番目のモデルを更新するにはどうすればよいですか?

class Logs(models.Model):
    actor_content_type = models.ForeignKey(ContentType,related_name='actor')
    actor_object_id = models.PositiveIntegerField() 
    actor = generic.GenericForeignKey('actor_content_type','actor_object_id')
    verb = models.CharField(max_length=255)
    description = models.TextField(blank=True,null=True)
    target_content_type = models.ForeignKey(ContentType,related_name='target',blank=True,null=True)
    target_object_id = models.PositiveIntegerField(blank=True,null=True) 
    target = generic.GenericForeignKey('target_content_type','target_object_id')
    object_content_type = models.ForeignKey(ContentType,blank=True,null=True)
    object_object_id = models.PositiveIntegerField(blank=True,null=True) 
    object = generic.GenericForeignKey('object_content_type','object_object_id')
    timestamp = models.DateTimeField(auto_now_add=True)
    public = models.BooleanField(default=True)

class LogFeeds(models.Model):
    actors_content_type = models.ForeignKey(ContentType,related_name='actors')
    actors_object_id = models.PositiveIntegerField() 
    actors = generic.GenericForeignKey('actors_content_type','actors_object_id')
    verbs = models.CharField(max_length=255)
    descriptions = models.TextField(blank=True,null=True)
    targets_content_type = models.ForeignKey(ContentType,related_name='targets',blank=True,null=True)
    targets = generic.GenericForeignKey('targets_content_type',)
    objects_content_type = models.ForeignKey(ContentType,blank=True,null=True)
    objects_object_id = models.PositiveIntegerField(blank=True,null=True) 
    objects = generic.GenericForeignKey('objects_content_type','objects_object_id')
    logs = models.ManyToManyField(Logs)
4

1 に答える 1

0

何のために必要なのかわからない。

コードに何かを記録したい場合は、sentryプロジェクトを見てください。これをハンドラーとして設定し、通常の Django ロギング システムで使用します。

車輪を再発明したい場合は、いくつかのアドバイスがあります。

ManyToManyFieldまず、ログを取得する必要はありません。Log1つしか持てないと思いLogFeedます。代わりにForeignKeyfrom Logto を使用してください。LogFeeds

次に、コードは次のようになります。

def log(actor, target, object):
    now, today = …

    feed = (LogFeed.objects.select_for_update()
                   .get_or_create(actor=actor, 
                                  target=target, 
                                  object=object,
                                  date=today))
    Log.objects.create(feed=feed,
                       verb='Something happened',
                       timestamp=now)

実際post_save、送信に関心のある各インスタンスのシグナルで呼び出すことができます。

Django でシグナルを使用する方法の例については、関連ドキュメントを参照してください。

于 2012-12-05T08:30:58.487 に答える