Пользовательский менеджер Django - как использовать пользовательский менеджер перед QuerySet
Я строю свой собственный менеджер, чтобы получить перевод модели. Идея заключается в следующем:
Основная модель:
class BlogTranslationManager(models.Manager):
def language(self):
lang = translation.get_language()
return BlogTranslation.objects.filter(lang=lang)
class ArticleTranslationManager(models.Manager):
def language(self):
lang = translation.get_language()
return ArticleTranslation.objects.filter(lang=lang)
class Blog(models.Model):
created = models.DateTimeField()
objects = models.Manager()
translations = BlogTranslationManager()
# PROBLEM HERE
@property
def articles(self):
# here I need translations of all articles of this blog
# I cannot do:
return self.blog_articles.translations.language('en')
# because 'translations' Manager cannot be called on QuerySet
# what can I do here? am I missing something in CustomManagers?
class Article(models.Model):
blog = models.ForeignKey(Blog, related_name="blog_articles")
objects = models.Manager()
translations = ArticleTranslationManager()
class BlogTranslation(models.Model):
book = models.ForeignKey(Book, related_name="book_translations")
field_name = models.CharField(max_length=10)
lang = models.CharField(max_length=3)
translation = models.TextField()
class ArticleTranslation(models.Model):
article = models.ForeignKey(Article, related_name="article_translations")
field_name = models.CharField(max_length=10)
lang = models.CharField(max_length=3)
translation = models.TextField()
и в шаблоне я хочу иметь возможность звонить:
{{ blog.articles }}
Я описал проблему прямо внутри кода выше, есть идеи по этому поводу? Любая помощь высоко ценится!
1 ответ
Решение
Попробуйте использовать Article.translations
сначала менеджер, затем отфильтруйте полученный набор запросов. Если я правильно понимаю ваши модели, вы хотите что-то вроде:
@property
def articles(self):
return Article.translations.language('en').filter(article__blog=self)