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了未解析的引用。我错过了什么?
使用类方法:
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)
解决方案:编写一个函数,为字段提供默认值
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.
| 归档时间: |
|
| 查看次数: |
5538 次 |
| 最近记录: |