使用 Django 中的信号更新记录



我创建了 2 个模型:

  1. Logs存储每个条目的日志;
  2. LogFeeds 获取上面比较演员、动词和日期的所有条目的计数。

如何使用信号从第一个模型更新我的第二个模型?

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)

我不确定,你需要它做什么。

如果你想在代码中记录一些东西,请查看哨兵项目。你把它设置为一个处理程序,并将其与普通的Django日志系统一起使用。

如果你想重新发明轮子,我有一些建议:

首先,您不需要为日志设置ManyToManyField。我想Log只能有一个LogFeed.请改用从LogLogFeedsForeignKey

然后代码可能如下所示:

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 中使用信号的示例,请参阅相关文档。

最新更新