Skip to main content
 首页 » 编程设计

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

2025年05月04日29zhenyulu

我的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'] 

它可能需要一些调整,但这是总体思路。