2009-09-03 18 views
17

Django ile basit bir uygulama oluşturuyorum. Ayrıca, çok sık bir çeşit operasyon gerçekleştirdiğimi fark ettim. Örneğin, çoğu zaman, Olumlu = True olan tüm Makale nesnelerini almam gerekir. Yani modelde get_published işlevini tanımlamak mümkün mü diye düşünüyorum? Modeller aşağıdaki gibiyseDjango modelleri, özel işlevler

işlevi uygulayan bir yol önerebilir (basitleştirilmiş)

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

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

Ama bu şekilde

çalışmıyor?

cevap

53

Ne muhtemelen istediğiniz django Dokümanlar bir custom manager

geçerli: o zaman böyle bir şey yapmak için izin verir

 # 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) 

: docs here belirtildiği gibi

>>> 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

İyi bir kod örneği. Özlü django bir parçası açıkladı daha önce bana (benim noobosity) anlamsız görünüyordu. +1. – chucksmash

12

, Nesnelerinize özel satır düzeyi işlevselliği eklemeniz gerekiyorsa, modunuzda özel yöntemler tanımlamanız gerekir ls. Bununla birlikte, eğer peşindeyseniz, özel çizelgeli geniş işlevselliği (belirli koşulları nitelendiren tüm Makale nesnelerini alma gibi), özel yöntemleri model Managers (aciniglio cevabının yukarısında olduğu gibi) tanımlamanız gerekir.

11

Statik makine dekoratörünü kullanabilirsiniz.

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

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

Bunu yapmak için teşekkürler! Cevap ver, farklı, soru. – alexsalo

+1

Bunun yerine bir 'classmethod' olmalıdır. –

İlgili konular