Django AppRegistryNotReady: модели еще не загружены - обратный запрос внешнего ключа между двумя приложениями - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь создать приложение рейтингов для сайта агрегации новостей, но я считаю, что моя реализация приложений или запросы внешних ключей от оценок к статьям неверны.Я продолжаю получать

raise AppRegistryNotReady("Models aren't loaded yet.")

django.core.exceptions.AppRegistryNotReady: Модели еще не загружены.

при миграции.Идея состоит в том, что отдельный рейтинг статьи каждого пользователя обрабатывается ArticleRating, а затем каждая статья будет иметь средний балл, который обрабатывается TotalArticleRating

Я думаю, что проблема сводится к одной из 3 вещей: 1. пользовательрейтинги должны быть реализованы в виде модели в приложении статей, а затем на них должна ссылаться модель TotalRatings.2. мой синтаксис запроса внешнего ключа неверен.Я попытался использовать article.articlerating_set для набора запросов объектов ArticleRating, но он возвращает только атрибут, не определенный.3. Мне нужно по-разному ссылаться на объект статьи, связанный с каждым объектом рейтинга.

from django.db import models
from users.models import User
from Articles.models import Article





class AbstractRating(models.Model):
    score = models.IntegerField()



    def __str__(self):
        return str(self.score)

    class Meta:
        abstract = True
        ordering= ['-score']

class ArticleRating(AbstractRating):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    rater = models.ForeignKey(User, on_delete=models.CASCADE)

class OverallArticleRating(AbstractRating):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    def getArticleAverageScore(art):
        sumUserScore = 0
        averageUserScore = 0
        ratingSet = ArticleRating.objects.filter(article=art)
        if len(ratingSet) > 0:
            for userRating in userRatingSet:
                sumUserScore += userRating.score
            averageUserScore = sumUserScore/(ArticleRating.objects.filter( article=art).count())
            return averageUserScore
        else: 
            return 0

    score = getArticleAverageScore(article)

1 Ответ

0 голосов
/ 25 марта 2019

Проблема в последней строке, где вы звоните getArticleAverageScore на уровне класса. Это не имеет никакого смысла;Вы должны вызывать его с экземпляром модели, но так как он вызывается во время определения, прежде чем вообще появятся какие-либо экземпляры.

Если вам нужен атрибут score, который всегда отражает средний балл, затем используйте свойство:

@property
def score(self):
    sumUserScore = 0
    sumUserScore = 0
    averageUserScore = 0
    ratingSet = ArticleRating.objects.filter(article=set)
    ...

Однако обратите внимание, что ваш метод действительно неэффективен.Вместо этого следует использовать агрегацию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...