如何从 Django 类模型调用方法到 Django 字段?

aba*_*sta 1 django django-models python-3.x

我创建了以下 Django 模型,我正在尝试初始化一个字段points- 使用同一模型的实例总数,即:

class Task(models.Model):
    DEFAULT_VALUE     = 5
    description       = models.CharField(max_length=60)
    points            = self.total() * DEFAULT_VALUE
    STATUS            = (('A', 'Active'), ('C', 'Cancelled'), ('D', 'Done'))
    status            = models.CharField(max_length=1, choices=STATUS, default='A')

    def total(self):
        count_active = len(Task.objects.filter(status='A'))
        return count_active
Run Code Online (Sandbox Code Playgroud)

python manage.py shell我可以创建两个实例,Task我可以确定已创建的实例总数len(Task.objects.filter(status='A'))),但是,当我尝试将相同的代码实现到函数中时,我遇到self了未解析的引用。我错过了什么?

rud*_*dra 6

使用类方法:

class Task(models.Model):
    ...
    @classmethod
    def total(cls, status=None):
        return cls.objects.filter(status=status).count()
Run Code Online (Sandbox Code Playgroud)

用法:

Task.total('A')
Run Code Online (Sandbox Code Playgroud)

  • 此方法的一个缺点是用户无法编辑/更改值 **`points`** 字段 (2认同)

JPG*_*JPG 6

解决方案:编写一个函数,为字段提供默认值

from django.apps import apps


def get_points():
    Task = apps.get_model(app_label='your_app_name', model_name='Task')
    return Task.objects.filter(status='A').count() * Task.DEFAULT_VALUE


class Task(models.Model):
    DEFAULT_VALUE = 5
    STATUS = (('A', 'Active'), ('C', 'Cancelled'), ('D', 'Done'))
    description = models.CharField(max_length=60)
    points = models.IntegerField(null=True, blank=True, default=get_points)
    status = models.CharField(max_length=1, choices=STATUS, default='A')
Run Code Online (Sandbox Code Playgroud)

我在这里做了什么??
我创建了 aIntegerField来存储point带有default参数的s 数据,该参数是callable default function.