Как получить метод модели 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)
Или полностью изменить весь подход к представлению, но есть много способов сделать это.