我的models.py如下:
class Prescription(models.Model):
pr_id = models.CharField()
date_prescribed = models.DateTimeField()
doctor = models.ForeignKey('Doctor')
pharmacy = models.ForeignKey('Pharmacy')
class Doctor(models.Model):
name = models.CharField()
age = models.IntegerField()
class Pharmacy(models.Model):
name = models.CharField()
status = models.CharField()
现在我需要从本月开始按月分组并返回6个月的所有pr_id的数量。这个数据需要在json中,因为它需要发送到Angular来呈现折线图。我正在使用Django休息框架。我的views.py如下:
class PrescriptionTrendListView(generics.ListAPIView):
end_date = datetime.utcnow().date()
start_date = end_date + relativedelta(months=-6)
queryset = (Prescription.objects.extra(select={'month': connection.ops.date_trunc_sql('month', 'date_prescribed')})
.filter(date_prescribed__range=(start_date,end_date))
.values('month')
.annotate(Count('pr_id'))
.order_by('month'))
serializer_class = LineGraphSerializer
查询集有效,因为我在shell中尝试了它,它为我提供了正确的数据,如下所示:
>>> queryset
[{'pr_id__count': 16, 'month': datetime.datetime(2015, 2, 1, 0, 0, tzinfo=<UTC>)},
{'pr_id__count': 71, 'month': datetime.datetime(2015, 3, 1, 0, 0, tzinfo=<UTC>)},
{'pr_id__count': 75, 'month': datetime.datetime(2015, 4, 1, 0, 0, tzinfo=<UTC>)},
{'pr_id__count': 96, 'month': datetime.datetime(2015, 5, 1, 0, 0, tzinfo=<UTC>)},
{'pr_id__count': 99, 'month': datetime.datetime(2015, 6, 1, 0, 0, tzinfo=<UTC>)},
{'pr_id__count': 93, 'month': datetime.datetime(2015, 7, 1, 0, 0, tzinfo=<UTC>)},
{'pr_id__count': 39, 'month': datetime.datetime(2015, 8, 1, 0, 0, tzinfo=<UTC>)}]
但是,我不知道如何创建LineGraphSerializer。查询集给出的两个字段是Ids的计数和初始模型中没有的月份。如何创建序列化文件?
答案 0 :(得分:1)
您可以将ModelSerializer用于viewset所代表的同一个类(在您的情况下为Prescription),并使用ReadOnlyField
添加自定义字段。类似的东西:
class LineGraphSerializer(serializers.ModelSerializer):
pr_id__count = serializers.ReadOnlyField()
month = serializers.ReadOnlyField()
class Meta:
model = Prescription
fields = ['pr_id__count', 'month']
可能需要一些调整,但这是一般的想法。