반응형
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를 다음과 같이 쿼리하고 싶습니다.
Bar.objects.filter(foo.is_active())
다음과 같은 오류가 발생합니다.
SyntaxError at /
('non-keyword arg after keyword arg'
이것을 어떻게 달성 할 수 있습니까?
모델 메서드 또는 속성에 대해 쿼리 할 수 없습니다. 쿼리에서 그 안에있는 기준을 사용하거나 목록 이해력 또는 genex를 사용하여 Python에서 필터링하십시오.
사용자 지정 관리자를 사용할 수도 있습니다. 그런 다음 다음과 같이 실행할 수 있습니다.
Bar.objects.foo_active()
그리고 당신이해야 할 일은 :
class BarManager(models.Manager):
def foo_active(self):
# use your method to filter results
return you_custom_queryset
문서를 확인하십시오 .
비슷한 문제가 있습니다. 클래스 기반보기를 사용 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)
메서드를 필터링 할 수는 없지만 Foo의 is_active 메서드가 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)
참고 URL : https://stackoverflow.com/questions/2276768/django-query-filtering-from-model-method
반응형
'Programing' 카테고리의 다른 글
C에서 double이 C ++보다 소수를 더 적게 인쇄하는 이유는 무엇입니까? (0) | 2020.11.25 |
---|---|
std :: copy_if 알고리즘이없는 이유는 무엇입니까? (0) | 2020.11.25 |
여러 인수가있는 필터와 장고의 체인 필터의 차이점 (0) | 2020.11.25 |
MVCS-모델보기 컨트롤러 서비스 (0) | 2020.11.25 |
브라우저는 Ajax 요청 후 얼마나 기다려야합니까? (0) | 2020.11.25 |