2012-07-23 39 views
5

Tôi rất tò mò nếu có phương pháp hay nhất hoặc cách được khuyến nghị để thực hiện việc này?Django - Làm thế nào để ghi đè lên bộ lọc trên một mô hình?

Nói rằng tôi có một mô hình như thế này:

class Cat(models.Model): 
    field1=models.CharField(...) 
    field2=models.CharField(...) 
    evil=models.BooleanField(...) 

Những gì tôi đang cố gắng để đạt được là tôi không muốn một lần xem bao giờ có thể truy cập hồ sơ Cát nơi ác là True.

Tôi có thực sự cần thêm .filter (evil = False) vào mọi cuộc gọi Cat.objects.filter hay có cách nào đó để thực hiện nó một lần trong lớp và làm cho những con mèo ác không bao giờ xuất hiện ở bất kỳ đâu?

+1

Tôi nghĩ rằng một người quản lý tùy chỉnh là con đường để đi ở đây: https://docs.djangoproject.com/en/dev/topics/db/managers/# custom-managers – Jingo

+0

Tôi đồng ý @Jingo. Làm cho nó một câu trả lời và bạn có phiếu bầu của tôi. –

+0

Cảm ơn Jingo. Điều đó có vẻ đầy hứa hẹn. Nếu nó hoạt động, tôi sẽ viết câu trả lời của riêng tôi ở đây. Tôi vẫn tò mò nếu có ai khác có ý tưởng khác nhau nhưng tôi sẽ đưa ra một bức ảnh. – Greg

Trả lời

8

Ok, người quản lý tùy chỉnh có thể phù hợp tại đây. Chỉ cần có một cái nhìn vào docs. Và giống như Chris Pratt nói, hãy nhớ rằng người quản lý đầu tiên sẽ trở thành người quản lý mặc định.

Hy vọng điều này sẽ đi đúng hướng.

Cập nhật (có thể bạn có thể làm điều đó như thế này):

from django.db import models 

class EvilCategoryManager(models.Manager): 
    def get_query_set(self): 
     return super(EvilCategoryManager, self).get_query_set().filter(evil=False) 

class Cat(models.Model): 
    #.... atrributes here 
    objects = models.Manager() 
    no_evil_cats = EvilCategoryManager() 
+0

Cảm ơn, bạn có nghĩa là trở lại siêu (EvilCategoryManager ...? – Greg

+0

Ya phải, chỉ cần chỉnh sửa lỗi đánh máy của tôi – Jingo

+1

Tại sao bạn không chỉ trả về 'super (EvilCategoryManager, self) .filter (evil = False)'? – kosii

Các vấn đề liên quan