Django Rest框架限制get_queryset结果不包括所有字段
view.py 序列化程序.pyDjango 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.
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']