当value为True时计算django字段并显示此计数

时间:2019-01-07 10:40:09

标签: python django

我在Django中有一个ProjectsTasks的模型。一个项目可以有很多任务,这是我的模型:

class Project(models.Model):
    project_name = models.CharField(max_length=200)
    is_complete = models.BooleanField(default=False)
    def __str__(self):
        return self.project_name


class Task(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    task_name = models.CharField(max_length=100)
    task_desc = models.TextField(max_length=600)
    due_date = models.DateField('due date')
    is_complete = models.BooleanField(default=False)

    task_desc.short_description = "Task description"
    def __str__(self):
        return self.task_name

我想在项目旁边显示总任务数和已完成任务数。我已将以下内容添加到admin.py中,以显示每个项目的总任务数:

def project_task_count(self, obj):
    return obj.task_set.count()

我还如何向管理员添加仅已完成任务的计数,并复制这种方法以在网站上显示这些计数,而不仅仅是在管理面板中显示?

我尝试将其添加到模型中,但不起作用:

def num_complete(self, obj):
    return self.is_complete.count()

2 个答案:

答案 0 :(得分:1)

您可以像这样在Project中添加属性方法:

class Project(models.Model):
    project_name = models.CharField(max_length=200)
    is_complete = models.BooleanField(default=False)
    def __str__(self):
        return self.project_name

    @property
    def num_completed(self):
        self.task_set.filter(is_complete=True).count()

并按如下所示将该属性添加到Adminsite的read_only fields中:

@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    ...
    readonly_fields = ["num_completed"]

答案 1 :(得分:1)

def project_task_count(self, obj):
    return obj.count()

如果obj是所有任务obj = Task.objects.all()的查询集

def num_complete(self, obj):
    return obj.count()

如果obj是所有已完成任务obj = Task.objects.filter(is_complete = True)的查询集