Home > OS >  Django REST Framework - return a value from get_queryset?
Django REST Framework - return a value from get_queryset?

Time:12-04

I am trying to return a value from get_queryset.

def get_queryset(self):
   if self.request.user.is_superuser:
        return StockPriceModel.objects.order_by('ticker').distinct()
   elif not self.request.user.is_authenticated:
        print('in')
        print(self.request.data)
        last_price = StockPriceModel.objects.all().filter(
                ticker=self.request.data['ticker']).order_by('-last_date_time')[0].last_price
        print(last_price)
        return last_price

last price gets printed without an issue.

In return I get various errors:

TypeError at /api/stock-prices-upload/ 'float' object is not iterable

If I try to return till:

StockPriceModel.objects.all().filter(
                ticker=self.request.data['ticker']).order_by('-last_date_time')

It works.

As soon as I try to return just the 0 position queryset I get errors.

I assume this is because get_queryset is supposed to return a queryset. Not sure how to return just the value.

Edit:

I am now trying to get only the latest row i.e. [0] form the data but still getting the same errors i.e.

StockPriceModel object is not iterable

# The current output if I don't add the [0] i.e. try to get the last row of data

[{"id":23,"last_price":"395.2","name":null,"country":null,"sector":null,"industry":null,"ticker":"HINDALCO","high_price":null,"last_date_time":"2022-10-20T15:58:26 04:00","created_at":"2022-10-20T23:20:37.499166 04:00"},{"id":1717,"last_price":"437.5","name":null,"country":null,"sector":null,"industry":null,"ticker":"HINDALCO","high_price":438.9,"last_date_time":"2022-11-07T15:53:41 04:00","created_at":"2022-11-07T14:26:40.763060 04:00"}]

Expected response:


[{"id":1717,"last_price":"437.5","name":null,"country":null,"sector":null,"industry":null,"ticker":"HINDALCO","high_price":438.9,"last_date_time":"2022-11-07T15:53:41 04:00","created_at":"2022-11-07T14:26:40.763060 04:00"}]

I have tried using last, get etc. Just won't work.

CodePudding user response:

Because, get_queryset() always return a queryset of objects or a list of objects.

You cannot return an object or a field from the get_queryset method.

the last_price value will be printed, but it is a field value and therefore the get_queryset method will not return it.

When you add [0], it takes the first object from the filtered queryset. Till that point, it is a queryset of objects.

CodePudding user response:

A bit hacky and I am sure there must be a better way to do this.

I wanted to get return of either a single row(last_date_time) based or the last_price value.

I wrapped the query:

# removed the .last_price
last_price = StockPriceModel.objects.all().filter(
                ticker=self.request.data['ticker']).order_by('-last_date_time')[0]
last_price = [last_price] # made it into a list, i.e. iterable
return last_price

And now I can get the last row.

Posting here incase someone spends the same number of hours trying to figure this out. If you have the correct way of doing this, please post.

  • Related