Как получить метод модели Django, указав параметры в URL с помощью фреймворка REST?

У меня есть модель Account с ForeignKey user и метод total_value(), который возвращает значение float64. Я хотел бы получить значение float, введя первичные ключи account и user в качестве параметров в URL.

Для этого я ловлю параметры с помощью request.query_params и выбираю нужный объект Account, но фреймворк выдает ошибку.

https://mysite/api/widget/total/?account=1&owner=1

'Account' object is not iterable 

Что я упускаю? Пожалуйста, найдите мой код ниже.

models.py

class Account(TimestampedModel):
    name = models.CharField(max_length=20, null=True, blank=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    def total_value(self):
        return do_stuff(self)

serializer.py

class TotalAssetsValueSerializer(serializers.ModelSerializer):

    class Meta:
        model = Account
        fields = ('total_value',)

view.py

class TotalAssetsValueView(viewsets.ModelViewSet):
    serializer_class = TotalAssetsValueSerializer
    http_method_names = ['get']

    def get_queryset(self):
        user = self.request.query_params.get('user')
        account = self.request.query_params.get('account')
        return Account.objects.get(pk=account, user=user)

Я уверен, что есть счет с pk=1 и user=1, так что, возможно, моя ошибка в том, что я возвращаю объект, а не кверисет. К сожалению, когда я filter вместо get, он возвращает [].

Здесь вы возвращаете один Account объект, но get_queryset метод должен возвращать QuerySet объектов. Поэтому он выдает ошибку, что единственный объект не является итерабельным.

def get_queryset(self):
    user = self.request.query_params.get('user')
    account = self.request.query_params.get('account')
    return Account.objects.get(pk=account, user=user)

В зависимости от того, что вы хотите, вы можете изменить его на одиночный объект QuerySet:

...
return Account.objects.filter(pk=account, user=user)

Или полностью изменить весь подход к представлению, но есть много способов сделать это.

Вернуться на верх