开发者

Django fetch model objects based on time with interval on the model itself

开发者 https://www.devze.com 2022-12-11 05:24 出处:网络
I\'m trying to fetch all expired objects for a model in my Django application. The model looks like this:

I'm trying to fetch all expired objects for a model in my Django application.

The model looks like this:

MyModel(models.Model):
    owner = models.ForeignKey(User)
    last_check = models.DateTimeField(blank=True, null=True)
    interval = models.IntegerField(default=1800)

I need to fetch all matching objects where last_check is earlier than now minus the check interval in order to determine if the object should be checked again.

No problem if I use a static interval:

time_diff = datetime.now() - timedelta(seconds=1800)
My开发者_如何学编程Model.object.filter(last_check__lte=time_diff)

But when the interval is on the model itself I can't figure out how to do it. This is what I tried:

objects_to_check = MyModel.objects.filter(
                                        last_check__isnull=False
                                    ).filter(
                                        last_check__lte=datetime.now() - timedelta(seconds=F('interval'))
                                    )

But that didn't work at all, only gave me the following error

unsupported type for timedelta seconds component: F

Any idea how to solve this?


Hm... I am not sure if you can modify the value of the field being looked up. Database would still need to retrieve the value first, apply the function timedelta on it and than do a comparison.

I think you might need to rethink your architecture... but I might be wrong. Maybe instead of storing last_check, store the expired property, that you can check directly:

MyModel.objects.filter(expired__lte=current_date)

and then when updating the model:

def save(self):
    self.expired = datetime.now() + self.interval;

or something like that.


F object stands for a reference to model field in the SQL query, so you cannot initialize a Python object with it. You can write database-specific query using extra method or just filter them on Python level:

filter(lambda x: x.last_check <= datetime.now() - timedelta(seconds = x.interval), MyModel.objects.all())


support for this kind of queries is in the works: http://code.djangoproject.com/ticket/10154

0

精彩评论

暂无评论...
验证码 换一张
取 消