Django Rest Framework Ограничение результата get_queryset для включения не всех полей - PullRequest
0 голосов
/ 31 января 2020

view.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'))

serializer.py

class CharityTotalSerializer(ModelSerializer):
    charity_name= serializer.ReadOnlyField(source='charityID.charityName')
    total_donation= serializer.DecimalField(max_digits=64,decimal_places=2)
    class Meta:
        model = Transaction
        fields = ['charity_name','total_donation']

модель

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)

Выкл. Из запроса, такого как этот http://localhost : 8000 / запросы / charitytotal /? UserID = 1 мой json ответ ограничен только [{"total_donation": "3.00"}, {"total_donation": "17.00"}] и не включает благотворительные имена, указанные в сериализаторе. Исходя из того, что я понимаю, .values ​​должен возвращать указанную переменную charityID и total_donation, которые должны быть в состоянии взаимодействовать с моим сериализатором. Любое понимание будет оценено

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Это потому, что вы возвращаете набор запросов Values ​​из метода get_queryset, когда получаете значение userID в request.GET. Также я предполагаю, что для вас важно вернуть этот способ, чтобы вы могли группировать и суммировать значения общего пожертвования. Итак, я думаю, что вы можете подойти примерно так:

Сначала измените метод get_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'))

Затем обновите сериализатор следующим образом:

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

Кроме того, лучше иметь charityName уникальным (используя unique=True в моделях), чтобы он не давал запутанных результатов.

0 голосов
/ 31 января 2020

Вы должны положить его в Serializer, и он будет работать нормально.

charity_name = serializer.SerializerMethodField()

def get_charity_name(self, instance):
    return instance.charityID.name
...