2010-11-22 2 views
0

나는 다음과 같은 장고 모델이 - 장고 모델 외래 키 필드를 일치

class M(models.Model): 
    ... 
    disp_name = models.CharField(max_length=256, db_index=True) 
    ... 

class XX(models.Model): 
    x = models.ForeignKey(User) 
    y = models.ForeignKey(M, unique=True) 

지금 내 views.py에, 나는 필드 y.disp_name와 XX의 모든 항목에 대한 부분 문자열 일치를 수행 할를.

일반적으로 사람은이 작업을 수행 할 것 - M.objects.filter(disp_name__istartswith='string')

그러나 여기 MModel XX의 외래 키입니다. 그래서 내가 XX.objects.filter(y.disp_name__istartswith='string')을하면 오류가 발생합니다. 또한

이 너무 실패 - SyntaxError: keyword can't be an expression (<console>, line 1)

어떻게이 작업을 수행하는 - 나는 말합니다 얻을 u = User.objects.get(id=1) u.xx_set.filter(y.disp_name__istartswith='string')

예외?

답변

2

X, Y 및 M 대신 올바른 필드 이름을 사용했으면 좋겠어요. 따르기가 정말 어렵습니다.

그러나 어떤 경우에, 당신은 항상 필터 식의 왼쪽에있는 관계를 따라 이중 밑줄 구문을 사용한다는 :

XX.objects.filter(y__disp_name__istartswith='string') 

(이에 대한 기술적 인 이유는 filter 해당 매개 변수입니다 실제로 함수에 대한 키워드 인수이므로 왼쪽의 표현식은 문자열이 아니어야합니다.

+0

죄송합니다. 고마워, 그게 문제를 해결 했어! 그래서 django는 LHS 부분을 '__'로 나눕니다 & 필드로 사용합니까? –

+1

물론, 자연스럽게 조회 유형 ('in','istartswith' 등)과 조인을 구별 할 필요가 있기 때문에 그것보다 복잡합니다. 관심이 있다면'django.db.models.sql.query.Query.add_filter'의 코드를보십시오. –