2011-08-31 4 views
3

필드가 문자열과 열 값의 연결 인 행을 선택하려고합니다. 이것은 내가 얻을 수있는 가장 가까운 곳이었습니다.Django select 필드는 문자열과 열 값의 연결입니다.

qs = Report.objects.filter(job=self, persona__identity="u" + F("user__id")) 

보고서에 persona 및 user 필드가 있습니다. Persona 객체는 식별자와 ID의 연결 인 ID 필드를 포함합니다. 나는 persona의 ID 문자열이 보고서에서 참조하는 사용자와 일치하는 모든 보고서를 얻으려고합니다. (이 내 실제 테이블 이름 ... 모든 무고한 사람들을 보호하기 위해 변경되지 않습니다.)이 같은 쿼리를 생성

,

WHERE (`persona`.`identity` = u + `report`.`user_id` AND ... 

을하지만 내가 정말 필요로하는 것은

WHERE (`persona`.`identity` = CONCAT("u", `report`.`user_id`) AND ... 
같은 것이있다

ORM으로이를 수행 할 수있는 방법이 있습니까?

+0

당신이 Persona.identity은 (대신에 'U'+ ID의) 사용자 테이블에 FK를 reular을 변경 considedered 적이 있습니까? 이것은 데이터 무결성을 제공하려는 경우 권장되는 IMO입니다. – dzida

답변

4

extra을 사용하여 원시 SQL에서 조회를 정의 할 수 있습니다. 뭔가 같은 :

Report.objects.extra({ 
    where=['(`persona`.`identity` = CONCAT("u", `report`.`user_id`)'] 
}) 

이 같은 코드가 서로 다른 DB 엔진에서 휴대용없는로서, 원시 SQL을 사용하여 몇 가지 단점이 있지만, 복잡한 쿼리, 그것은 ORM에 솔루션을 구둣 주걱하는 것보다 훨씬 더 표현입니다 .

+0

그것을 얻었습니다! 감사. 나는 올바르게 Join을 수행 할 수 있도록 Report.objects.select_related(). extra (...)를 할 필요가 있었다. –

+0

기꺼이 도와 드리겠습니다. 원시 SQL로 떨어지는 것은 단점이 있지만 이런 경우에는 때로는 대안이 없습니다. –

1

대안은 장고 1.8에서 사용할 수 있습니다 :

from django.db.models import Value 
from django.db.models.functions import Concat 

Report.objects.filter(persona__identity=Concat(Value('u'), 'user__id')) 
관련 문제