使用Django中的信号更新记录

使用Django中的信号更新记录,django,django-models,Django,Django Models,我创建了两个模型: 日志存储每个条目的日志 LogFeeds获取上面比较参与者、动词和日期的所有条目的计数 如何使用信号从第一个模型更新第二个模型 class Logs(models.Model): actor_content_type = models.ForeignKey(ContentType,related_name='actor') actor_object_id = models.PositiveIntegerField() actor = generic.

我创建了两个模型:

  • 日志
    存储每个条目的日志
  • 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)
    

    我不知道你需要它做什么

    如果您想在代码中记录一些内容,请查看project。您可以将其设置为处理程序,并将其与普通Django日志系统一起使用

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

    首先,日志不需要
    ManyToManyField
    。我假定
    Log
    只能有一个
    LogFeed
    。使用
    ForeignKey
    Log
    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\u save
    signal发送您感兴趣的每个实例时调用


    有关如何在Django中使用信号,请参见相关示例。

    您希望实现什么?@Krzysiek Szularz我希望将日志中的单个活动提要合并到日志提要中。比较参与者、动词和时间戳(仅日期)。并在日志提要中将其显示为一条记录。