【发布时间】:2011-12-15 05:21:30
【问题描述】:
我有几个模型可以将日志数据保存到我的数据库中。我还有一个“最近的事件”应用程序,我想选择哪些模型将数据发送到事件应用程序。我认为装饰器会对此有好处,所以我可以将它添加到我想要的模型中:
@logger
class TemperatureLog(models.Model):
Date = models.DateTimeField(auto_now_add=True)
Device = models.ForeignKey(TemperatureDevice)
Data = models.PositiveIntegerField()
这是事件模型,我使用通用外键:
class Event(models.Model):
Active = models.BooleanField()
Queue = models.BooleanField()
ContentType = models.ForeignKey(ContentType)
ObjectID = models.PositiveIntegerField()
Event = generic.GenericForeignKey('ContentType', 'ObjectID')
这里是装饰器:
def logger(event):
def wrap(*args, **kwargs):
from toolbox.event.models import Event
event(*args, **kwargs).save()
myid = event(*args, **kwargs).id
new = Event(Event=event.objects.get(id=myid))
if Event.objects.all().filter(Active=True).count() >= 25:
new.Queue = True
new.save()
else:
new.Active = True
new.save()
for item in Event.objects.all().filter(Queue=True):
item.Queue = False
item.Active = True
item.save()
if Event.objects.all().filter(Active=True).count() >= 25:
break
return event(*args, **kwargs)
return wrap
它可以正常工作,它创建事件实例并保存它。我遇到的问题是 save() 会被调用两次。一个在装饰器中,第二个在收集温度日志的实际代码中(因为我不会提前知道哪些应用程序会发送事件,哪些不会,或者它们将来是否会改变)。所以我想知道是否有更优雅的方法来做到这一点。我喜欢装饰器方法,因为我所要做的就是将它添加到模型类中,但我不太相信 save 会被调用两次。
【问题讨论】:
标签: python django django-models decorator