正常的方法或属性?

时间:2018-10-18 18:15:30

标签: python django

以下是普通模型方法还是属性?

@property
def num_used_licenses(self):
    return len(CompanyUser.objects.filter(company_id=self.pk, activated_on__isnull=False)) # why doesn't count() work here?

两点:

  • 它确实会执行数据库查询,因此调用它在性能上并非微不足道。
  • 它永远不会带任何参数

让我印象深刻的是,如果property既琐碎又不带任何参数,那么您会使用它,但是上面应该是什么,为什么?

1 个答案:

答案 0 :(得分:0)

如果要访问num_used_licenses作为Model属性(不需要像方法一样调用),请使用@property装饰器。如果将来有机会将其更改为接受参数,请将其保留为方法。

Django Model Methods文档包括@property装饰器的用法示例:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime
        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    @property
    def full_name(self):
        "Returns the person's full name."
        return '%s %s' % (self.first_name, self.last_name)

以及指向glossary的链接:

  

属性

     

也称为“托管属性”,是自2.2版以来Python的功能。这是一种实现属性的巧妙方法,其用法类似于属性访问,但是其实现使用方法调用。