Как написать запрос Django ORM, в котором таблица выбора разделяет общий столбец с другой таблицей? - PullRequest
0 голосов
/ 22 января 2019

Я использую Django и Python 3.7.У меня есть эти две модели.Обратите внимание, что у них обоих есть похожее поле

class Article(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE,)


class WebPageStat(models.Model):
    objects = WebPageStatManager()
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, )
    score = models.BigIntegerField(default=0)

Я хотел бы написать запрос Django ORM, который выбирает одну из моделей, но выполняет объединение в общем столбце, чтобы провести сравнение по «счету»поле.Я попробовал следующее, но, увы, ошибка

Article.objects.filter(publisher=webpagestat.publisher, webpagestat.score__gte==100)
  File "<input>", line 1
SyntaxError: positional argument follows keyword argument

Как мне включить таблицу "WebPageStat" в мое объединение?

1 Ответ

0 голосов
/ 22 января 2019

То, что вы хотите, легко сделать в Django, используя поиск, который охватывает отношения .В вашем примере вам нужно добавить способ ссылки на связанные объекты в ORM.Это делается путем установки атрибута related_name полей ForeignKey.Хотя это не является строго необходимым, это более понятно.Вы можете прочитать больше о related_name и related_query_name здесь .Короче говоря, ваши модели должны выглядеть следующим образом:

class Article(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='articles')


class WebPageStat(models.Model):
    objects = WebPageStatManager()
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name='stats')
    score = models.BigIntegerField(default=0)

Как только это будет сделано, ваш запрос будет выполнен с помощью следующего кода:

Article.objects.filter(publisher__stats__score__gte=100)

Вкратце, этот запрос выполняетсявыбирая каждую статью, у издателя которой есть хотя бы одна статистика веб-страницы, рейтинг которой больше или равен 100.

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