Django, фильтрация запросов из метода модели
у меня есть эти модели:
def Foo(Models.model):
size = models.IntegerField()
# other fields
def is_active(self):
if check_condition:
return True
else:
return False
def Bar(Models.model):
foo = models.ForeignKey("Foo")
# other fields
Теперь я хочу запросить бары, которые имеют активные Foo как таковые:
Bar.objects.filter(foo.is_active())
Я получаю ошибку, такие как
SyntaxError at /
('non-keyword arg after keyword arg'
как я могу добиться этого?
5 ответов:
вы не можете запрашивать методы или свойства модели. Либо используйте критерии в нем в запросе, либо фильтруйте в Python, используя понимание списка или genex.
вы также можете использовать специальный менеджер. Тогда вы могли бы запустить что-то вроде этого:
Bar.objects.foo_active()
и все, что вам нужно сделать, это:
class BarManager(models.Manager): def foo_active(self): # use your method to filter results return you_custom_queryset
Проверьте docs.
у меня была аналогичная проблема: я использую представление на основе класса
object_list
и мне пришлось фильтровать по методу модели. (хранение информации в базе данных не было вариантом, потому что свойство было основано на времени, и мне пришлось бы создать cronjob и/или... не так)мой ответ неэффективен, и я не знаю, как он будет масштабироваться на больших данных; но он работает:
q = Model.objects.filter(...)... # here is the trick q_ids = [o.id for o in q if o.method()] q = q.filter(id__in=q_ids)
вы не можете фильтровать методы, однако если метод is_active на Foo проверяет атрибут на Foo, вы можете использовать синтаксис двойного подчеркивания, например
Bar.objects.filter(foo__is_active_attribute=True)
class Page(models.Model): category = models.ForeignKey(Category) title = models.CharField(max_length=128) url = models.URLField() ... class Category(models.Model): ... open = models.BooleanField(default=True)
может быть, вы можете использовать простой фильтр, для этого типа условия.
Page.objects.filter(category__open=True)