텍스트 길이에 따른 장고 필터
텍스트 길이를 기준으로 모델을 필터링하고 싶습니다.
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
'Programing' 카테고리의 다른 글
동일한 데이터베이스 내에서 컬렉션을 복사하는 가장 빠른 방법은 무엇입니까? (0) | 2020.11.29 |
---|---|
data.sql MySQL Docker 컨테이너 가져 오기 (0) | 2020.11.29 |
imageView 위와 아래의 추가 공간을 어떻게 제거합니까? (0) | 2020.11.29 |
밀리 초를 분과 초로 변환 하시겠습니까? (0) | 2020.11.29 |
WooCommerce 주문 세부 정보를 얻는 방법 (0) | 2020.11.29 |