在Django Rest Framework中为自定义字段序列化数据

时间:2015-08-24 13:01:04

标签: python django serialization django-rest-framework

我的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的计数和初始模型中没有的月份。如何创建序列化文件?

1 个答案:

答案 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']

可能需要一些调整,但这是一般的想法。