2010-01-04 2 views
0

모든 모델에 동일한 모델의 FK가있는 모델이 있습니다. 제가 아는 전부는 FK입니다. 어떻게 모델 중 FK가 부착되었는지 확인할 수 있습니까? 예를 들어 아래하나의 값으로 여러 모델 쿼리

는 clearify합니다 :

class ModelA(models.Model): 
     title = models.CharField("title", max_length=80) 

class ModelB(models.Model): 
     fk = models.ForeignKey(ModelA) 

class ModelC(models.Model): 
     fk = models.ForeignKey(ModelA) 

는 어떻게 B 또는 C가 FK이 있는지 여부를 각 모델 제외/시도를 사용하지 않고 알아낼 수 있습니까?

답변

0
if ModelB.objects.filter(fk=your_fk): 
    print "B" 
else: 
    print "C" 
합니다 (FK 단지 내가 두 모델을 추가하지만, 실제 응용 프로그램에서 MODELA에 FK있는 모델의 여러 가능한 X 금액이 있습니다이 경우 기록을 위해, 그들 중 하나 일 수 있습니다)

이 FK 전혀 중 B 또는 C에 존재 여부를 알 수없는 경우 다른 검사를 추가

if ModelB.objects.filter(fk=your_fk): 
    print "B" 
elif ModelC.objects.filter(fk=your_fk): 
    print "C" 
else: 
    print "none" 
+0

. try/except의 문제점은 무엇입니까? 단일 데이터베이스 쿼리를 사용하여 두 결과를 모두 확인 하시겠습니까? –

+0

은 내가 20 개의 모델을 가지고 있다고 가정 할 수 있습니다. 그러나 나는 그것들을 제외하고 시도하고 싶지 않습니다. 모든 모델에서 결과를 확인하기 위해 쿼리하는 방법이 있는지 궁금합니다. 그렇지 않으면 중간 모델을 만들어야합니다. – swoei

+0

당신의 의도는 무엇입니까 - 시간 최적화 (20 개가 아닌 하나의 복잡한 요청을 간단하게 만들 수 있습니까?) 또는 구문상의 편의성은 무엇입니까? –

0

당신이 ModelA에 ForeignKeys를 함께 많은 모델이 말했듯이 어쩌면 당신의 필드를 가진 고려해야하는 경우 이 정보를 캐시하는 ModelA? save() 방법 ModelB/C/.. 또는 데이터베이스 저장 프로 시저로 업데이트 할 수 있습니다.

+0

이 대답은 어떻습니까? –

0

당신이 문법 설탕 및 쿼리의 감소 수 후 경우이 시도 :

a=ModelA.objects.annotate(nb=Count('modelb'), nc=Count('modelc')).get(pd=your_fk) 
if a.nb: 
    return 'B' 
elif a.nc: 
    return 'C' 
else: 
    return 'A' 

당신이 언급하지만 그 시도 너무 비슷한 느낌/제외 (장고> = 1.1)

관련 문제