我的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()
现在我需要获取从本月开始按月分组的所有 pr_id 的计数并返回 6 个月。此数据需要在 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。查询集提供的两个字段是 ID 的计数和不在初始模型中的月份。如何创建序列化程序文件?
请您参考如下方法:
您可以为 View 集表示的同一类使用 ModelSerializer(在您的情况下为处方)并使用 ReadOnlyField 添加自定义字段。像这样的东西:
class LineGraphSerializer(serializers.ModelSerializer):
pr_id__count = serializers.ReadOnlyField()
month = serializers.ReadOnlyField()
class Meta:
model = Prescription
fields = ['pr_id__count', 'month']
它可能需要一些调整,但这是总体思路。
