2017-10-10 6 views
0

그 항목장고 ORM 질의 - 역에서 조회

User.objects.filter (name__in = 'X', 'Y'])

같은 장고 ORM 통해 목록에 있는지 확인하기 쉬운 방법에 대해 반대 방향. 사용자가 그가 들리는 교외 지역 목록 (쉼표로 구분 된 목록)이 있고 특정 교외를 방문하지 않았는지 확인해야합니다. shell_plus에서 검색

class User(models.Model): 
    suburb = models.TextField(_('suburbs'),validators=[validate_comma_separated_integer_list], blank=True) 

데이터 교외 (100)를 방문하지 않은 모든 사용자를 얻기 위해 원하는

{'suburb': '965,967,969,972' } 

에 대한 이런 종류의 것인가? 당신이 포스트 그레스 DB를 사용하는 경우

+0

이 더 많은 검색 엔진에 비해위한 일이다 데이터베이스; 문자열 대신 실제 레코드를 참조하도록 모델을 올바르게 구조화하지 않는 한. –

답변

2

Q objects을 사용하여이를 수행 할 수 있습니다.

startswith_string = str(suburb) + "," 
contains_string = "," + str(suburb) + "," 
endswith_string = "," + str(suburb) 

users = User.objects.filter(
    Q(suburb__startswith=startswith_string) | Q(suburb__contains=contains_string) | Q(suburb__endswith=endswith_string), 
) 
+0

이것은 마지막에 존재하는 경우 1100이라는 값을 포함하는 항목을 포함합니다. –

+1

그렇지 않습니다. 엔트리는', 100'으로 끝나야합니다. :) 'endswith_string'의 시작 부분에 쉼표를 적어 둡니다. – anupsabraham

+0

나는 모든 Q에서 contains를 사용하고 있다고 생각했습니다;) –

0

당신은

User.objects.exclude(suburb__contains='100') 

같은 contains lookup을 사용할 수 있습니다, 그럼 내가 대신 쉼표 seprated 값 ArrayField을 사용하는 것이 좋습니다 것입니다.

+0

이렇게하면 값이 1000 인 항목도 제외됩니다. – anupsabraham

+0

당신이 맞습니다. 즉 ArrayField를 사용하도록 제안한 이유가 무엇입니까? –

0

봅니다 in 조회와 제외 사용

User.objects.exclude(suburb__in=['100']) 

귀하의 의견은 { '교외': '965967969972'} 경우

,

input = {'suburb': '965,967,969,972' } 
input_list = input['suburb'].split(',') # Split the string into list 
User.objects.exclude(suburb__in=input_list)