Django / Python: как я могу фильтровать с помощью пользовательского метода модели?Это возможно? - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть модель с пользовательским методом.Вот пример:

class MyModel(models)
   id = models.AutoField(primary_key=True)
   name = models.CharField(max_length=50)
   nickname = models.CharField(max_length=50)
   time_created = models.DateTimeField(auto_now_add=True)

   def sample_method(self)
       right_now = datetime.now()
       created_time = self.time_created
       time2compare = timedelta(minutes=3)

       timeout = True
       if(right_now - created_time) > time2compare:
           timeout = False
       return timeout

Я пытаюсь сделать что-то подобное (я знаю, это не работает)

queryset = MyModel.objects.filter (timeout =Неверно)

Как я могу решить эту проблему?Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Вы не можете использовать пользовательский метод в вашей модели для фильтрации, потому что фильтры будут преобразованы в saw sql, что будет невозможно с некоторым кодом Python.Тем не менее, следующее должно решить вашу проблему:

import datetime
queryset = MyModel.objects.filter(\
     time_created__lt=(datetime.now()-datetime.timedelta(minutes=3)))
0 голосов
/ 11 ноября 2010

Ваш тест тайм-аута очень прост для повторной реализации в качестве фильтра набора запросов.

Для действительно сложного теста, который не может быть выражен в языке запросов Django или в сыром SQL, вы можете написать что-то вроде:

def sample_filter(self, method_name, arg=False)
    for i in self.objects.all():
        if getattr(self, method_name)() == arg:
            yield i

Этот метод будет возвращать итератор для каждого экземпляра x модели, где x.method_name () == arg.Однако это не может быть связано как набор запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...