2013-06-26 2 views
0

일반적으로 SomeModel.objects()을 통해 쿼리 세트에 액세스합니다.장고 관리자 내부의 "개체"는 무엇입니까

모델 내에서 objects은 관리자 (예 : objects=SomeManager())로 정의됩니다.

따라서 Manager에서 메소드를 정의 할 경우 objects에 어떻게 액세스합니까?

...

class SomeManager(models.Manager): 
    def some_method(self): 
     (HOW WOULD I ACCESS OBJECTS HERE?) 

class SomeModel(models.Model): 
    ... blah blah 
    objects=SomeManager() 

내가 뭔가를 필터링하고 싶었다면, 나는 내가 관리자 내부 SomeModel.objects.filter을 할 수있는 생각하지만, 어떻게 든 그 이상한 느낌. 그것은 self.filter 또는 무언가 일 것입니까?

+1

'관리자'에서'self.filter'를 할 수있을 것이라고 확신합니다. 그 다음에는 어떤 문제가 있습니까? –

+0

매니저가 모델의'objects' 속성에 묶여 있다고 가정하면 안됩니다. –

답변

1

예. 'self'는 Manager 자체를 나타내는 self.filter을 사용합니다. 모델의 기본 Manager는 objects이며 사용자 정의 관리자를 지정하지 않으면 자동으로 작성됩니다. 사용자 정의 관리자를 수행 중이므로 objects을 사용하지 않습니다. 왜냐하면 분명히 사용자 정의 관리자가 아닌 기본값을 사용하기 때문입니다.

그래서, 문서 도구에서, 예는 다음과 같습니다

class BookManager(models.Manager): 
    def title_count(self, keyword): 
     return self.filter(title__icontains=keyword).count() 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author) 
    publisher = models.ForeignKey(Publisher) 
    publication_date = models.DateField() 
    num_pages = models.IntegerField(blank=True, null=True) 
    objects = BookManager() 
1

짧은 답변 : 당신은 자체 내에서 관리자에 액세스하지 않습니다. self

objects은이 경우 관리자가되므로 모든 방법에 액세스 할 필요가 없습니다. 일반적으로 관리자를 사용하여 filterget과 같은 항목에 액세스하므로 self.filter 또는 self.get을 사용하여 클래스에서 로컬로 액세스 할 수 있습니다.

관리자가 반환 한 모든 쿼리 집합에 select_related과 같은 값이 필요하면 get_queryset 메서드를 재정의 할 수 있습니다.