了解Django注释

时间:2019-05-01 05:59:49

标签: django

我的模特:

class Ward(models.Model):
    id = models.AutoField(primary_key=True, unique=True)
    clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
    name = models.CharField(max_length=500, default='', blank=True)
    description = models.CharField(max_length=2000, default='', blank=True)
    bedcapacity = models.IntegerField(default=1)

class Bed(models.Model):
    id = models.AutoField(primary_key=True, unique=True)
    name = models.CharField(max_length=200, default='',
                            blank=True, unique=True)
    clinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
    ward = models.ForeignKey(Ward, on_delete=models.CASCADE)
    occupied = models.BooleanField(default=False)

我正在写将以下伪代码转换为django:

from django.db.models import F, Q, When
clinic = Clinic.objects.get(pk=10)
wards = Ward.objects.filter(clinic=clinic)
ward_set = []
for ward in wards:
    occupied = len(Bed.objects.filter(clinic = clinic, ward = ward, occupied = True))
    total = len(Bed.objects.filter(clinic = clinic, ward = ward))
    ward['occupied'] = occupied # The next two lines are pseudocode
    ward['total']=total
    ward_set.append(ward)
return render(request, 'file.html',
{
'wards': ward_set
})

我相信我应该使用注释,但是我发现很难从文档中理解注释。

1 个答案:

答案 0 :(得分:2)

那呢?

from django.db.models import Q, Count

ward_set = Ward.objects.filter(clinic=10).annotate(
    occupied=Count('bed', filter=Q(bed__occupied=True)),
    total=Count('bed')

)

您可能会看到conditional aggregation here

的一些示例