Django Rest框架限制get_queryset结果不包括所有字段

Django Rest框架限制get_queryset结果不包括所有字段,django,django-rest-framework,Django,Django Rest Framework,view.py 序列化程序.py class charity_totals(generics.ListAPIView): serializer_class= CharityTotalSerializer queryset=Transaction.objects.all() def get_queryset(self): queryset = super().get_queryset() user_id = self.request.GET.

view.py

序列化程序.py

class charity_totals(generics.ListAPIView):
    serializer_class= CharityTotalSerializer
    queryset=Transaction.objects.all()
    def get_queryset(self):
        queryset = super().get_queryset()
        user_id = self.request.GET.get('userID')
        if user_id is None:
            return queryset
        queryset = queryset.filter(userID=user_id)
        return queryset.values('charityID').annotate(total_donation=Sum('transactionAmount'))
模型


对于这样的请求,我的json响应仅限于[{“total_捐赠”:“3.00”}、{“total_捐赠”:“17.00”}],不包括序列化程序中指定的慈善机构名称。据我所知,.values应该返回指定的慈善ID和总捐赠的dict,该dict应该能够与我的序列化程序交互。任何洞察都将不胜感激

您必须将其放入序列化程序中,它将正常工作

class Transaction(models.Model):
    transactionAmount = models.DecimalField(max_digits=6, decimal_places=2)
    userID = models.ForeignKey(User,on_delete=models.CASCADE)
    charityID = models.ForeignKey(Charity,on_delete=models.CASCADE, related_name='charity_set')
    processed = models.BooleanField(auto_created=True, default=False)
    transactionDate = models.DateField(auto_now_add=True)

这是因为在request.get中获取
userID
的值时,您正在从
get\u queryset
方法返回值queryset。另外,我认为这对你们以这种方式返回是很重要的,这样你们就可以按照捐赠总额的和进行分组。所以,我认为你可以这样做:

from django.db.models import F, Sum
...

def get_queryset(self):
    queryset = super().get_queryset()
    user_id = self.request.GET.get('userID')
    if user_id is not None:
        queryset = queryset.filter(userID=user_id)
    return queryset.values('charityID').annotate(total_donation=Sum('transactionAmount')).annotate(charity_name=F('charityID__charityName'))
首先,更改get_queryset方法以返回带注释的项目的名称:

charity_name = serializer.SerializerMethodField()

def get_charity_name(self, instance):
    return instance.charityID.name
然后按如下方式更新序列化程序:

from django.db.models import F, Sum
...

def get_queryset(self):
    queryset = super().get_queryset()
    user_id = self.request.GET.get('userID')
    if user_id is not None:
        queryset = queryset.filter(userID=user_id)
    return queryset.values('charityID').annotate(total_donation=Sum('transactionAmount')).annotate(charity_name=F('charityID__charityName'))

另外,最好让charityNameunique(在模型中使用
unique=True
),这样就不会产生令人困惑的结果。

只使用代码的答案被认为是低质量的:确保提供代码的功能以及如何解决问题的解释。如果你能在你的文章中添加更多的信息,这将有助于询问者和未来的读者。另请参见解释完全基于代码的答案:
class CharityTotalSerializer(ModelSerializer):
    charity_name= serializer.ReadOnlyField()  # no need to define source
    total_donation= serializer.DecimalField(max_digits=64,decimal_places=2)
    class Meta:
        model = Transaction
        fields = ['charity_name','total_donation']