Есть ли лучший способ запросить объекты из одного приложения в другое в трясогузке / django? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть приложение home с моделью HomePage, которое получает объект из модели BlogPage в приложении blog . Я использую этот код ниже, чтобы получить объект от BlogPage до HomePage.

приложение блога

class HomePage(Page):
    primary_header = models.CharField(max_length=100, blank=True,)
    secondary_header = models.CharField(max_length=100, blank=True,)
    hero_banner_image = models.ForeignKey(
        'wagtailimages.Image', 
        null=True,
        blank=False,
        on_delete=models.SET_NULL, 
        related_name='+')

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        # Get object from Blog Page
        blogpages = self.get_children().get(title='Blog Page').get_children().live().public().order_by('-first_published_at')
        context['blogpages'] = blogpages
        return context

Я использовал get() для получения объекта по названию, но я чувствую, что это может быть не лучший способ сделать это. Если бы мне пришлось переименовать поле заголовка BlogPage, например, в «Страница блога», это нарушит код, поскольку «Страница блога» больше не используется. Есть ли лучший способ выполнить запрос от модели BlogPage к HomePage?

домашнее приложение

class BlogPage(Page):
    subpage_types = ['PostPage']

    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        category_slug = request.GET.get('category', None)
        context['categories'] = BlogCategory.objects.all()
        return context

1 Ответ

1 голос
/ 06 мая 2020

Если вы знаете, что ваш HomePage будет иметь только один дочерний элемент типа BlogPage, вы можете использовать запрос PageQuerySet exact_type Wagtail.

blog_index_page = self.get_children().exact_type(BlogPage).first()
blog_pages = blog_index_page.get_children().live().public().order_by('-first_published_at')

Если у вас возникли проблемы с импортом модели из другого приложения, вы можете обойти это с помощью apps.get_model, которое является частью django.apps.

Примечание: вам может потребоваться выполнить этот импорт в вашем get_context, чтобы избежать проблем циклического импорта.

from django.apps import apps

MyModel1 = apps.get_model('app1', 'MyModel1')
...