Итак, я столкнулся с проблемой. Я хочу взять значения из моей модели и использовать их в уравнении, но я продолжаю получать эту ошибку:
TypeError: unsupported operand type(s) for -: 'RankingHistory' and 'RankingHistory'
Однако всякий раз, когда я запускаю команду печати для отдельных переменных, она печатает соответствующее число .
Я попытался преобразовать его в список, как вы можете видеть ниже, чтобы попытаться исправить, но все равно получаю ту же ошибку. Чувствую себя немного потерянным после поиска в Google в течение нескольких часов.
def ranking_updates(campaign_keywords):
for keyword in campaign_keywords:
rankings = RankingHistory.objects.filter(keyword_id=keyword.id).all()
ranking_count = rankings.count() - 1
# converted queryset to list to allow use with equations
ranking_list = list(rankings)
# variables used to find rankings location in list
one_count = ranking_count - 1
seven_count = ranking_count - 7
thirty_count = ranking_count - 30
num_rankings = ranking_list[ranking_count]
# find 1 day, 7 day, and 30 day change of rankings + lifetime
if rankings.count() > 29:
# variables used to convert list from RankingHistory into variables
first_ranking = ranking_list[0]
one_day = ranking_list[one_count]
seven_day = ranking_list[seven_count]
thirty_day = ranking_list[thirty_count]
# variables used to create changes over 1 day, 7 day, 30 day, and lifetime
one_day_change = num_rankings - one_day
seven_day_change = num_rankings - seven_day
thirty_day_change = num_rankings - thirty_day
life = num_rankings - first_ranking
campaign_keywords.filter(id=keyword.id).update(one_day=one_day_change)
campaign_keywords.filter(id=keyword.id).update(seven_day=seven_day_change)
campaign_keywords.filter(id=keyword.id).update(thirty_day=thirty_day_change)
campaign_keywords.filter(id=keyword.id).update(life=life)
return
# find 1 day and 7 day change of rankings + lifetime
elif rankings.count() > 6:
# variables used to convert list from RankingHistory into variables
first_ranking = ranking_list[0]
one_day = ranking_list[one_count]
seven_day = ranking_list[seven_count]
# variables used to create changes over 1 day, 7 day, and lifetime
one_day_change = num_rankings - one_day
seven_day_change = num_rankings - seven_day
life = num_rankings - first_ranking
campaign_keywords.filter(id=keyword.id).update(one_day=one_day_change)
campaign_keywords.filter(id=keyword.id).update(seven_day=seven_day_change)
campaign_keywords.filter(id=keyword.id).update(life=life)
return
# find 1 day change of rankings + lifetime
elif rankings.count() > 1:
# variables used to convert list from RankingHistory into variables
first_ranking = ranking_list[0]
one_day = ranking_list[one_count]
# variables used to create changes over 1 day and lifetime
one_day_change = num_rankings - one_day
life = num_rankings - first_ranking
campaign_keywords.filter(id=keyword.id).update(one_day=one_day_change)
campaign_keywords.filter(id=keyword.id).update(life=life)
return
else:
print(num_rankings)
pass
models.py
from django.db import models
from account.models import SiteUser
class Campaign(models.Model):
user = models.ForeignKey(SiteUser, on_delete=models.CASCADE)
name = models.CharField(blank=False, max_length=70)
url = models.CharField(blank=False, max_length=70)
def __str__(self):
return '%s' % self.name
class Keyword(models.Model):
keyword = models.CharField(blank=False, max_length=70)
initial_ranking = models.CharField(blank=True, max_length=10, default='N/A')
true_url = models.CharField(blank=True, max_length=70, default='N/A')
rankings = models.CharField(blank=True, max_length=10, default='N/A')
one_day = models.IntegerField(default=0)
seven_day = models.IntegerField(default=0)
thirty_day = models.IntegerField(default=0)
life = models.IntegerField(default=0)
campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE)
def __str__(self):
return '%s' % self.keyword
class RankingHistory(models.Model):
ranking = models.IntegerField(blank=False)
date = models.DateTimeField(auto_now_add=True)
keyword = models.ForeignKey(Keyword, on_delete=models.CASCADE)
def __str__(self):
return '%s' % self.ranking
Для справки 'campaign_keywords' относится к модели 'keyword'. В то время как модель RankingHistory отслеживает рейтинг модели «ключевое слово».
Приложение выполняет поиск в Google любого поискового запроса и определяет рейтинг веб-сайта по указанному ключевому слову. Затем он сохраняет его в модели RankHistory для указанного ключевого слова c.
В этой функции моя цель состоит в том, чтобы получить историю рейтинга ключевого слова и вычислить его движение за 1-дневный период, 7-дневный период, 30-дневный период и время жизни ключевого слова (с точки зрения история в базе данных).
Я пытаюсь извлечь из списка данных в модели 'RankHistory' для каждого c 'Keyword', чтобы вычислить это.