2014-06-05 2 views
0

나는 모델, 다음과 같이 정의되어 있습니다장고 - 필터 모델 방법에 따라

class Item(models.Model): 
    name = models.CharField(max_length=200, null=True, default='', blank=True) 
    creation_date = models.DateTimeField('date created', default=timezone.now()) 

    def was_published_today(self): 
     today = timezone.now() - datetime.timedelta(days=1) 
     return self.creation_date >= today 

내가 이런 항목의 집합 필터링 싶습니다 :

items = Item.objects.filter(was_published_today=True) 

을하지만이로 실행을 FieldError 이는 필터가 메서드를 기반으로 개체 집합을 필터링하지 않는 것처럼 보입니다. 세부 오류 :

Cannot resolve keyword 'was_published_today' into field. Choices are : creation_date, name 

올바른 방법은 무엇입니까? 나는 creation_date을 오늘 날짜와 비교할 수 있다는 것을 알고 있지만 그게 was_published_today이며, 나는 그것을 건조하게 유지하고 싶습니다.

답변

1

여기에서 django Managers을 사용할 수 있습니다.

사용자 관리자 : 모델에

class GetPublishedToday(models.Manager): 
     def get_query_set(self): 
     return super(GetPublishedToday, self).get_query_set().filter(creation_date= timezone.now() - datetime.timedelta(days=1)) 

:

class Item(models.Model): 
    name = models.CharField(max_length=200, null=True, default='', blank=True) 
    creation_date = models.DateTimeField('date created', default=timezone.now()) 
    was_published_today= GetPublishedToday() 

뷰 :

items = Item.was_published_today.all() # or .filter(name= "foobar") 

'' 'PS를 :. 그것의 검증되지 않은 코드를' ''

+0

감사! 그 부분은'creation_date' 대신'creation_date__gte'를 사용했던 Manager 부분에서 제외되었습니다. – Simon

+0

도와 주셔서 감사합니다 :) – ruddra

0

F expressions 올바른 방법이라고 생각합니다. 설명서의 예 :

from datetime import timedelta 
Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3)) 
+0

나는 그렇게 생각하지 않는다. 문서에서 언급했듯이'F expressions'은 모델 필드의 값을 가리키는 것이지, 그 메소드 ([source] (https://docs.djangoproject.com/en/dev/ref/models/queries/) # django.db.models.F)). – Simon

+0

queryset은 SQL 쿼리를 작성해야하기 때문에 모델의 메서드 중 하나를 필터로 사용할 수 없습니다. – erthalion