2012-11-10 3 views
2

내 모델에서 특정 개체를 가져 오는 데 문제가 있습니다.모델 필터링 기반 계산

class Subscription(models.Model): 
    subscriber = models.ForeignKey(Subscriber, null=False, blank=False, default=None, editable=False) 
    plan = models.ForeignKey(SubscriptionPlan, null=False, blank=False) 
    active_from_date =models.DateField(null=False, blank=False) 

class SubscriptionPlan(models.Model): 
    name = models.CharField(max_length=50, null=False, blank=False, default=None) 
    interval = models.PositiveIntegerField(null=False, blank=False, default=30) 

가 지금은 유효한 만이 구독을 얻으려면, 그래서 나는 이런 식으로 뭔가하려고 해요 :

내 모델처럼 보이는 내가 액세스 문제를했습니다

valid = Subscription.objects.filter(valid_from_date__gte=(datetime.date.today()-timedelta(days=plan__interval))) 

을 plan__interval 값으로 설정하십시오. 이 위치에서 상수 값 (예 : 10)을 사용하려고하면 모든 것이 제대로 작동합니다.

필터 계산에 plan.interval 값을 사용하려면 어떻게해야합니까?

+0

오류가 생성 되었습니까? –

+0

런타임 오류가 발생합니다. "global name 'plan__interval'이 정의되지 않았습니다." – Grzegorz

답변

1

당신이에 관심이있을 수 있습니다 : 날짜 시간에 정수를 추가 할 때 일관성이 어렵 기 때문에 당신이 당신의 Subscription에 다른 DatetimeField을 추가하고이 값을 채울 수 있도록, 나는 여전히 의심의 여지가 Filtering with calculations on fields

예를 들어 save(self, *args, **kwargs) 서브 스크립 션 방법의 plan ForeignKey에 따른 종료 날짜.

+0

새로운 파일을 추가 할 수 있다는 것을 알았지 만, 필자의 말에 따르면 중복 된 데이터입니다. 이 접근법은 계획을 가입으로 변경하는 것과 같이 다른 시나리오도 복잡하게 만들 수 있습니다. – Grzegorz

0

난 당신이

valid = Subscription.objects.annotate(plan_interval = Sum('plan__interval')).filter(valid_from_date__gte=(datetime.date.today()-timedelta(days=plan_interval))) 
+0

내 경우에는 설정 계획없이 가입을 할 수 없습니다. 이 경우 여전히 오류가 발생합니다. "global name 'plan__interval'이 정의되지 않았습니다." – Grzegorz

+0

나를 용서해주세요. 나는 틀린 질문을 읽습니다. 나는 나의 대답을 업데이트했다. 한번보세요 –

+0

불행히도 나는 여전히 "global name 'plan_interval'이 정의되지 않았습니다."오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? – Grzegorz

1

Raunak 아가 왈의 대답은 좋은 것 같다 필터에 외래 키를 사용하여 주석 기능을 사용하지만 시도 할 수 있습니다 추측이 :

= Subscription.objects.filter (active_from_date_ GTE 유효 = datetime.date.today() - F ('계획 _interval'))

+0

좋은 일이 바로 그가 원하는 것입니다. –