【问题标题】:filter prefetch_related and select_related results过滤 prefetch_related 和 select_related 结果
【发布时间】:2014-04-26 16:24:01
【问题描述】:

我有 3 个模型

models.py

class Book(models.Model):
     name = models.CharField(max_length=255, primary_key=True)
     ...

class BookTranslation(models.Model):
     book = models.ForeignKey(Book, related_name='translations')
     language = models.CharField(max_length=2, choices=LANGUAGE_CHOICES)
     ...

class Chapter(models.Model):
     book_translation=models.ForeignKey(BookTranslation,related_name='chapters')
     ...

我想用一种语言为一本书创建一个 DetailView,我的第一种方法是这样的:

views.py

class BookDetail(DetailView):
    model = Book

    def get_object(self):
        return self.model.objects.select_related('translations').prefetch_related('translations__chapters').get(slug=self.kwargs['slug'], translations__language=self.kwargs['language'])

但是这样我会返回所有相关的 BookTranslations 和章节,而不仅仅是我想要的语言...
是否可以过滤 select_related 以便在我的模板中,在 {{book.translations}} 我只有我要求的语言的翻译(章节相同)?

【问题讨论】:

    标签: python django django-queryset django-select-related django-multilingual


    【解决方案1】:

    由于您想要获取具有特定 BookTranslation 的 Book,因此最好将查询基于 BookTranslation 并从中获取 Book 对象。

    即使用类似的东西

    class BookDetail(DetailView):
        model = Book
    
        def get_object(self):
            self.booktranslation = BookTranslation.objects.select_related('book').get(book__slug=self.kwargs['slug'],
                                         language=self.kwargs['language'])
            return self.booktranslation.book
    

    然后您可以将 self.booktranslation 作为上下文变量传递以在模板中访问它。

    【讨论】:

      【解决方案2】:

      您可以尝试这样的方法只访问数据库一次并获取相关结果:

      class BookDetail(DetailView):
          model = Book
      
          def get_object(self):
              return self.model.objects.filter(slug=self.kwargs['slug'],
                                               translations__language=self.kwargs['language'],
                                               translations__chapter__name=self.kwargs['ch_name'], ) \
                                       .values('translations__language',
                                               'translations__another_field', 
                                               'translations__chapter__name',
                                               'translations__chapter__another_field', )[0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-23
        • 2023-01-06
        • 1970-01-01
        • 2023-03-30
        • 2020-09-12
        • 1970-01-01
        • 2021-09-06
        相关资源
        最近更新 更多