Используйте данные модели Django в уравнении - PullRequest
0 голосов
/ 08 мая 2020

Итак, я столкнулся с проблемой. Я хочу взять значения из моей модели и использовать их в уравнении, но я продолжаю получать эту ошибку:

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', чтобы вычислить это.

...