Django AttributeError: объект 'int' не имеет атрибута 'pk'
Я застрял :(. У меня есть API, который я не могу заставить работать с DRF. Я формирую свой набор запросов в представлении и результат, который я хочу получить, выходит в консоли:
web_1 | {'company_exchange': 969, 'company_exchange__company__name': 'LIGHTSPEED POS', 'company_exchange__stock_symbol': 'LSPD', 'strategy': 1, 'periodic_buy_period': 5, 'periodic_sell_period': 10, 'month': datetime.datetime(2021, 11, 1, 0, 0, tzinfo=<UTC>), 'periodic_sum': Decimal('1.2300000000')}
web_1 | {'company_exchange': 969, 'company_exchange__company__name': 'LIGHTSPEED POS', 'company_exchange__stock_symbol': 'LSPD', 'strategy': 1, 'periodic_buy_period': 2, 'periodic_sell_period': 14, 'month': datetime.datetime(2021, 12, 1, 0, 0, tzinfo=<UTC>), 'periodic_sum': Decimal('7.4200000000')}
web_1 | {'company_exchange': 969, 'company_exchange__company__name': 'LIGHTSPEED POS', 'company_exchange__stock_symbol': 'LSPD', 'strategy': 1, 'periodic_buy_period': 13, 'periodic_sell_period': 11, 'month': datetime.datetime(2021, 12, 1, 0, 0, tzinfo=<UTC>), 'periodic_sum': Decimal('100.9600000000')}
Я вижу, что obj передается в мой сериализатор, но до конца не могу понять, где я ошибаюсь.
Вот мой view.py
class TopHistoricalGainViewSet(viewsets.ModelViewSet):
queryset = TopHistoricalGains.objects.all()
serializer_class = TopHistoricalGainsSerializer
def get_queryset(self):
ids = self.queryset\
.values('id')\
#commented out as I don't need this just yet `#.distinct('company_exchange__id')\`
.order_by('company_exchange__id')
twelve_months_ago = datetime.datetime.now()+relativedelta(months=-12)
hg_list = TopHistoricalGains.objects.filter(id__in=ids, periodic_date_time__gte=twelve_months_ago)
hg_list = hg_list\
.annotate(month=TruncMonth('periodic_date_time')) \
.values('month') \
.annotate(periodic_sum=Sum('periodic_gain_max')) \
.values('company_exchange', 'company_exchange__company__name', 'company_exchange__stock_symbol', 'month', 'periodic_sum', 'strategy', 'periodic_buy_period', 'periodic_sell_period') \
#.order_by('company_exchange', '-periodic_sum', 'strategy', 'periodic_buy_period', 'periodic_sell_period')[:10]
for hg in hg_list:
print(hg)
return hg_list
class Meta:
ordering = ['periodic_sum', 'company_exchange']
Serializers.py
class TopHistoricalGainsSerializer(serializers.ModelSerializer):
first_bought = serializers.SerializerMethodField()
last_sold = serializers.SerializerMethodField()
company_exchange_name = serializers.SerializerMethodField()
company_exchange_stock_symbol = serializers.SerializerMethodField()
class Meta:
model = TopHistoricalGains
fields = (
'company_exchange_id', 'company_exchange_name', 'company_exchange_stock_symbol', 'strategy', 'periodic_date_time', 'periodic_gain_max', 'periodic_buy_period', 'periodic_sell_period','first_bought', 'last_sold'
)
def get_first_bought(self, obj):
try:
BuySellEvent = apps.get_model("calculations", "BuySellEvent")
buy_sell = BuySellEvent.objects.filter(company_exchange=obj['company_exchange'], strategy=obj['strategy'], buy_period=obj['periodic_buy_period'], sell_period=obj['periodic_sell_period']).earliest('buy_date_time')
if buy_sell:
lb = buy_sell.buy_date_time
else:
lb = None
except BuySellEvent.DoesNotExist:
lb = None
return lb
def get_last_sold(self, obj):
try:
BuySellEvent = apps.get_model("calculations", "BuySellEvent")
buy_sell = BuySellEvent.objects.filter(company_exchange=obj['company_exchange'], strategy=obj['strategy'], buy_period=obj['periodic_buy_period'], sell_period=obj['periodic_sell_period']).latest('sell_date_time')
if buy_sell:
ls = buy_sell.sell_date_time
else:
ls = None
except BuySellEvent.DoesNotExist:
ls = None
return ls
def get_company_exchange_name(self, obj):
return obj['company_exchange__company__name'] if obj and obj['company_exchange__company__name'] else 'N/A'
def get_company_exchange_stock_symbol(self, obj):
return obj['company_exchange__company__name'] if obj and obj['company_exchange__company__name'] else 'N/A'
Ошибка:
Моя цель - извлечь данные из таблицы TopHistoricalGains и создать список 10 лучших, основанный на сумме периодических_gain_max по месяцам.
Я предполагаю, что делаю несколько вещей неправильно. Но не могу понять, где происходит этот объект 'int' без атрибута 'pk'.
Любая помощь? Спасибо и будьте здоровы!
У меня была та же проблема, что и у вас, и мне помогла замена 'values' на 'only'. Согласно этой ссылке (https://books.agiliq.com/projects/django-orm-cookbook/en/latest/select_some_fields.html) разница в том, что 'only' также получает id. Я подходил к сериализаторам по-другому, поэтому не уверен, что это поможет, но может быть стоит попробовать?