筛选预取相关结果并选择相关结果

2024-06-17 09:25:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个模型

在模型.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,我的第一种方法是这样的:

在视图.py在

^{pr2}$

但是通过这种方式,我会返回所有相关的书籍翻译和章节,而不仅仅是我想要的语言…
是否可以过滤select_-related,以便在我的模板中{{图书.翻译}}我只有我要求的语言的翻译(章节相同)?在


Tags: namepy模型语言modelmodelslengthmax
2条回答

由于您希望获得一本具有特定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

你就可以通过了自译图书作为上下文变量在模板中访问它。在

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

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]

相关问题 更多 >