我有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}}我只用我要求的语言翻译(章节相同)?
答案 0 :(得分:1)
由于您希望获取具有特定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作为上下文变量传递给模板中的访问权。
答案 1 :(得分:0)
您可以尝试这样的操作只打一次数据库并获取相关结果:
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]