Ошибка при предварительном просмотре страницы Wagtail и получении связанных строк - PullRequest
0 голосов
/ 23 января 2019

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

from django.db import models
from modelcluster.fields import ParentalKey
from wagtail.core.models import Orderable, Page
from wagtail.snippets.models import register_snippet

@register_snippet
class Author(models.Model):
    name = models.CharField(max_length=255, blank=False)

class ArticleAuthorRelationship(Orderable, models.Model):

    author = models.ForeignKey('Author',
                                on_delete=models.CASCADE,
                                related_name='articles')

    page = ParentalKey('ArticlePage',
                                on_delete=models.CASCADE,
                                related_name='authors')

class ArticlePage(Page):

    def get_authors(self):
        """Returns a list of Author objects associated with this article."""
        return [a.author for a in self.authors.all().order_by('author__name')]

В шаблоне для ArticlePage я звоню self.get_authors(), чтобы получить список авторов.Это прекрасно работает, если статья «живая», или если я вызываю тот же метод для объекта в оболочке, но при предварительном просмотре страницы я получаю следующее:

File "/Users/phil/Projects/myproject/myapp/articles/models/pages.py", line 551, in get_authors
  return [a.author for a in self.authors.all().order_by('author__name')]
File "/Users/phil/.local/share/virtualenvs/myproject-zPWVWoxf/lib/python3.6/site-packages/modelcluster/queryset.py", line 467, in order_by
  sort_by_fields(results, fields)
File "/Users/phil/.local/share/virtualenvs/myproject-zPWVWoxf/lib/python3.6/site-packages/modelcluster/utils.py", line 19, in sort_by_fields
  items.sort(key=lambda x: (getattr(x, key) is not None, getattr(x, key)), reverse=reverse)
File "/Users/phil/.local/share/virtualenvs/myproject-zPWVWoxf/lib/python3.6/site-packages/modelcluster/utils.py", line 19, in <lambda>
  items.sort(key=lambda x: (getattr(x, key) is not None, getattr(x, key)), reverse=reverse)
AttributeError: 'ArticleAuthorRelationship' object has no attribute 'author__name'

Я в тупике - я не надеваюне понимаю, что отличает предварительный просмотр страницы трясогузки от обычного просмотра.Что-то странное в модели кластера?

1 Ответ

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

Да, это ограничение модуля django-modelcluster. Чтобы методы набора запросов Django, такие как order_by, работали с отношениями в памяти, которые не соответствуют реальному состоянию базы данных (что имеет место при предварительном просмотре, а также в некоторых других ситуациях, таких как просмотр старых ревизий), то моделькластер должен «подделать» операции, которые обычно выполняются с помощью SQL-запроса. На то, как хорошо работает «подделка», существуют некоторые ограничения, и некоторые операции (например, необработанные SQL-запросы) практически никогда не будут возможны.

Отсутствие поддержки order_by через внешний ключ является известным ограничением: https://github.com/wagtail/django-modelcluster/issues/45

Пока это не исправлено, обходной путь должен заключаться в том, чтобы окружить запрос блоком try / except AttributeError и вернуться к неупорядоченному списку.

...