2009-09-03 41 views
17

Tôi đang tạo ứng dụng đơn giản với django. Ngoài ra, tôi nhận ra rằng tôi đang làm một số loại hoạt động rất thường xuyên. Ví dụ tôi thường cần để có được tất cả các đối tượng Điều có isPublick = True. Vì vậy, tôi nghĩ là có thể để xác định chức năng get_published trong mô hình?Mô hình Django, chức năng tùy chỉnh

nếu mô hình trông như thế này (giản thể)

class Article(models.Model): 
    title = models.CharField(...) 
    isPublished = models.BooleandField() 

    def get_active(self): 
     return Article.objects.filter(isPublicshed = 1) 

Nhưng nó không hoạt động theo cách này

Bạn có thể đề nghị một cách để thực hiện chức năng?

Trả lời

53

Những gì bạn có thể muốn là một custom manager

Từ các tài liệu django:

 # An example of a custom manager called "objects". 

class PersonManager(models.Manager): 
    def get_fun_people(self): 
     return self.filter(fun=True) 

class Person(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    fun = models.BooleanField() 
    objects = PersonManager() 

    def __unicode__(self): 
     return u"%s %s" % (self.first_name, self.last_name) 

mà sau đó cho phép bạn làm điều gì đó như:

>>> p1 = Person(first_name='Bugs', last_name='Bunny', fun=True) 
>>> p1.save() 
>>> p2 = Person(first_name='Droopy', last_name='Dog', fun=False) 
>>> p2.save() 
>>> Person.objects.get_fun_people() 
[<Person: Bugs Bunny>] 
+3

Ví dụ về mã tốt. Giải thích ngắn gọn một phần của django mà trước đây dường như vô nghĩa đối với tôi (trong noobosity của tôi). +1. – chucksmash

12

Như được nêu trong docs here, nếu bạn cần thêm chức năng hàng cấp cho đối tượng của mình, bạn cần phải xác định các phương thức tùy chỉnh trên chế độ của mình ls. Tuy nhiên, nếu những gì bạn đang làm sau là tùy chỉnh chức năng bảng rộng (chẳng hạn như nhận tất cả các đối tượng Điều đủ điều kiện), bạn phải xác định phương thức tùy chỉnh trên model Managers (nhiều như aciniglio ở trên chỉ ra trong câu trả lời của họ).

11

Bạn có thể sử dụng trình trang trí tĩnh.

class Article(models.Model): 
    title = models.CharField(...) 
    isPublished = models.BooleandField() 

    @staticmethod 
    def get_active(): 
     return Article.objects.filter(isPublished = 1) 
+0

Cảm ơn bạn đã thực hiện điều này! Đã trả lời câu hỏi của tôi, khác biệt. – alexsalo

+1

Thay vào đó, đây phải là một 'classmethod'. –

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