我创建了 2 个模型:
-
Logs
存储每个条目的日志; -
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
.请改用从Log
到LogFeeds
的ForeignKey
。
然后代码可能如下所示:
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 中使用信号的示例,请参阅相关文档。