在wagtail / django中将对象从一个应用程序查询到另一个应用程序的更好方法?

问题描述 投票:0回答:1

我有一个具有HomePage模型的home应用,该应用从blog应用中的BlogPage模型获取对象。我使用下面的代码从BlogPageHomePage获取对象。

博客应用

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标题字段重命名为例如“博客页面”,由于不再使用“博客页面”,它将破坏代码。从BlogPageHomePage模型是否有更好的查询集方法?

家庭应用

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
python django wagtail
1个回答
0
投票

如果您知道您的HomePage只会有一个BlogPage类型的孩子,则可以使用WagtailPageQuerySetexact_type查询。

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')
© www.soinside.com 2019 - 2024. All rights reserved.