Programing

텍스트 길이에 따른 장고 필터

lottogame 2020. 11. 29. 09:34
반응형

텍스트 길이에 따른 장고 필터


텍스트 길이를 기준으로 모델을 필터링하고 싶습니다.

MyModel.objects.filter(len(text) > 10)

여기서 text는 MyModel 모델의 Char 또는 Text 필드입니다.


그것은 더 나은 것 당신은 단지 열을 추가하면 더 빨리 미리 계산 (memoizes) 텍스트의 길이.

예 :

class MyModel(models.Model):
    text = models.TextField()
    text_len = models.PositiveIntegerField()

     def save(self, *args, **kwargs):
         self.text_len = len(self.text)
         return super(MyModel, self).save(*args, **kwargs)

MyModel.objects.filter(text_len__gt = 10)     # Here text_len is pre-calculated by us on `save`

Django> = 1.8 경우 MySQL 또는 일부 다른 데이터베이스 의 경우 @Pratyush의 내부 기능인 Length 함수를 사용할 수 있습니다 .CHAR_LENGTH()LENGTH()

from django.db.models.functions import Length
qs = MyModel.objects.annotate(text_len=Length('text_field_name')).filter(
    text_len__gt=10)

또 다른 방법은 다음과 같습니다.

MyModel.objects.extra(where=["CHAR_LENGTH(text) > 300"])

텍스트 길이가 255 자 이상인 경우에도 사용할 수 있습니다.


정규식 필터를 사용하여 특정 길이의 텍스트를 검색 할 수 있습니다.

MyModel.objects.filter(text__regex = r'.{10}.*')

주의 사항 : MySQL의 경우 최대 길이 값은 255입니다. 그렇지 않으면 예외가 발생합니다.

DatabaseError: (1139, "Got error 'invalid repetition count(s)' from regexp")

Django> = 1.9에 대한 좋은 솔루션 조회 Length를위한 변환 으로 내장 함수 등록하여 가능합니다 CharField.

프로젝트에 변환을 한 번 등록 하십시오. (가장 좋은 곳은 models.py 일 것입니다.)

from django.db.models import CharField
from django.db.models.functions import Length

CharField.register_lookup(Length, 'length')

사용 :

result = MyModel.objects.filter(text__length__gt=10)

Length as a transform 문서에서 정확히 동일한 예제를 참조하십시오 .


LENGTH()대부분의 백엔드 및 CHAR_LENGTH()MySQL 대해 컴파일 된 모든 백엔드에서 올바르게 작동합니다 . 그런 다음 EmailField와 같은 CharField의 모든 하위 클래스에 대해 자동으로 등록됩니다. TextField개별적으로 등록해야합니다. 변환 이름은 동일한 이름의 필드 이름 또는 관련 필드 이름으로 음영 처리되거나 음영 처리 될 수 없으므로 "길이"라는 이름을 등록하는 것이 안전합니다.

유일한 단점은 가독성 퍼즐 일 수 있습니다. "길이"는 어디에서 왔습니까? (조회는 전역 적이지만 가독성에 유용하다면 쿼리 런타임에 가능한 오버 헤드없이 더 많은 모듈에 반복적으로 안전하게 등록 할 수 있습니다.)

유사하게 가치있는 다른 솔루션은 등록이 중요하고 유사한 쿼리가 반복적으로 사용되지 않는 경우 더 짧은 위 호브 입니다.


나는 당신의 앱 서버에서 문제를 해결하고 데이터베이스에 세금을 부과하지 않을 것입니다. 다음과 같이 할 수 있습니다.

models_less_than_ten = []
mymodel = MyModel.objects.all()
for m in mymodel:
    if len(m.text) > 10:
          models_less_than_ten.append(m)

참고 URL : https://stackoverflow.com/questions/12314168/django-filter-on-the-basis-of-text-length

반응형