簡體   English   中英

過濾prefetch_related和select_related結果

[英]filter prefetch_related and select_related results

我有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}}中的翻譯僅是我要求的語言(章節相同)?

由於要獲取具有特定BookTranslation的書,因此最好將查詢基於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作為上下文變量傳遞,以在模板中訪問它。

您可以嘗試這樣的操作,僅打一次數據庫並獲取相關結果:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM