Django rest framework Django Rest框架:除了默认的模型字段之外,还有其他数据的响应,这些数据需要来自sql查询

Django rest framework Django Rest框架:除了默认的模型字段之外,还有其他数据的响应,这些数据需要来自sql查询,django-rest-framework,Django Rest Framework,我是django和django rest框架的新手,正在尝试构建一个应用程序,它应该可以与手机通信 目前,我正在尝试创建一个响应,它不仅应该包括请求的模型的字段,还应该添加一些额外的数据,这些数据应该首先从另一个模型计算出来 我的代码中有两个模型: 1.比尔 2.BillComment(具有票据模型的外键) 这是一种多(BillComment)对一(Bill)关系。 我需要在响应中添加BillComment表中与特定账单相关的注释数 这是我当前的代码,它未运行: 型号.py class Bill

我是django和django rest框架的新手,正在尝试构建一个应用程序,它应该可以与手机通信

目前,我正在尝试创建一个响应,它不仅应该包括请求的模型的字段,还应该添加一些额外的数据,这些数据应该首先从另一个模型计算出来

我的代码中有两个模型: 1.比尔 2.BillComment(具有票据模型的外键)

这是一种多(BillComment)对一(Bill)关系。 我需要在响应中添加BillComment表中与特定账单相关的注释数

这是我当前的代码,它未运行:

型号.py

class BillComment(models.Model):

    bill    = models.ForeignKey(Bill)    
    user    = models.ForeignKey(User)  
    responsed_to = models.ForeignKey('rest_api.BillComment', null=True, blank=True) 
    date    = models.DateTimeField()
    content = models.CharField(max_length=500, default='')

    def __str__(self):
        return '%s %s %s %s %s' % (self.bill, self.user, self.responsed_to, self.date, self.content)
class BillSerializer(serializers.ModelSerializer):
    comments_count = serializers.SerializerMethodField()

    def get_comments_count(self, foo):
        comments_co = BillComment.objects.filter(bill=data.bill).count()
        return comments_co;

    class Meta:
        model = Bill
        fields = ('id', 'subject', 'date', 'description', 'status', 'parliament_member', 'comments_count')
序列化程序.py

class BillComment(models.Model):

    bill    = models.ForeignKey(Bill)    
    user    = models.ForeignKey(User)  
    responsed_to = models.ForeignKey('rest_api.BillComment', null=True, blank=True) 
    date    = models.DateTimeField()
    content = models.CharField(max_length=500, default='')

    def __str__(self):
        return '%s %s %s %s %s' % (self.bill, self.user, self.responsed_to, self.date, self.content)
class BillSerializer(serializers.ModelSerializer):
    comments_count = serializers.SerializerMethodField()

    def get_comments_count(self, foo):
        comments_co = BillComment.objects.filter(bill=data.bill).count()
        return comments_co;

    class Meta:
        model = Bill
        fields = ('id', 'subject', 'date', 'description', 'status', 'parliament_member', 'comments_count')
正如您所看到的,我试图用附加参数来响应。 我需要一些如何读取请求的账单行id的信息,这样我就可以过滤所有BillComment行,其中的“账单”字段(外键)指向序列化的同一账单

我该怎么做

也许我有比使用SerializerMethodField更合适的解决方案,请建议我如何正确地做到这一点


谢谢

您当前的代码离正确只有一步之遥,因为您几乎已经正确设置了所有内容。A将正在序列化的当前对象作为第一个参数传递给该方法,在您的情况下,该方法是正在序列化的
Bill
对象

因此,您的
get\u comments\u count
方法只需如下所示

def get_comments_count(self, bill):
    comments_co = BillComment.objects.filter(bill=bill).count()
    return comments_co
一切都应该按预期进行

您可以通过修改queryset以使用而不是手动来加快这一过程,这将节省n个额外的查询,同时提高性能。您只需将
.annotate(comments\u count=count('billcoment\u set'))
添加到视图当前查询集的末尾,然后将
comments\u count
字段作为
整型字段添加到序列化程序中

queryset = Bill.objects.all().annotate(comments_count=Count('billcomment_set'))
您的序列化程序将成为

class BillSerializer(serializers.ModelSerializer):
    comments_count = serializers.IntegerField(read_only=True)

    class Meta:
        model = Bill
        fields = ('id', 'subject', 'date', 'description', 'status', 'parliament_member', 'comments_count')

这是因为
comments\u count
属性将添加到queryset返回的每个对象中,序列化程序将像任何其他字段一样对其进行序列化。

不是直接的答案,但您是否需要计数以便正确分页?如果是这样,您可以开始检索
billcoment
。它将有一个总计数,
页面大小
评论数,以及一个指向下一个评论块的链接。或者,您可以通过在
billcoment.Bill
字段中添加
related\u name
字段,轻松获得特定
Bill
的所有注释列表。Bill
字段:
Bill=models.ForeignKey(Bill,related\u name='Bill\u comments')。然后在您的
BillSerializer
Meta.fields`语句中,添加` bill_注释',它将检索它们。您好,感谢您的快速响应。移动客户端需要显示针对特定账单的评论数量。移动应用程序应该请求一个特定的bill对象,我需要在JSON中添加一些额外的信息。我不需要自己序列化注释,它与分页无关。