【问题标题】:Django models, custom functionsDjango 模型、自定义函数
【发布时间】:2009-09-03 07:56:47
【问题描述】:

我正在使用 django 创建简单的应用程序。另外,我意识到我经常做某种操作。例如,我经常需要获取所有具有 isPublick = True 的 Article 对象。所以我在想是否可以在模型中定义 get_published 函数?

如果模型看起来像这样(简化)

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

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

但是这样不行

您能建议一种实现该功能的方法吗?

【问题讨论】:

    标签: django-models


    【解决方案1】:

    你可能想要的是custom manager

    来自 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)
    

    然后允许您执行以下操作:

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

    【讨论】:

    • 很好的代码示例。简洁地解释了以前对我来说毫无意义的 django 的一部分(在我的菜鸟中)。 +1。
    • 还值得一提的是,为了让它工作并避免 NameErrors,你需要在对象类之上编写管理器类,以便它识别它。
    【解决方案2】:

    正如docs here 中所述,如果您需要向对象添加自定义行级 功能,则需要在模型上定义自定义方法。但是,如果您追求的是自定义 table-wide 功能(例如获取符合特定条件的所有 Article 对象),则必须在 model Managers 上定义自定义方法(很像 aciniglio 以上在他们的回答中指出)。

    【讨论】:

      【解决方案3】:

      你可以使用 staticmethod 装饰器。

      class Article(models.Model):
          title = models.CharField(...)
          isPublished = models.BooleandField()
      
          @staticmethod
          def get_active():
              return Article.objects.filter(isPublished = 1)
      

      【讨论】:

      • 感谢您提出这个问题!回答了我的不同问题。
      • 这应该是classmethod
      猜你喜欢
      • 2017-09-28
      • 2012-07-06
      • 2010-12-18
      • 2016-01-09
      • 2016-04-06
      • 2015-07-09
      • 2015-09-17
      • 2017-08-13
      • 2013-04-18
      相关资源
      最近更新 更多