【问题标题】:Using Django RelatedField for custom join queries?使用 Django RelatedField 进行自定义连接查询?
【发布时间】:2013-09-20 09:48:01
【问题描述】:

我很好奇是否可以使用相关字段来引发自定义连接查询。 我想在 django-parler 中应用它,这是一个 Django 的多语言应用程序。

例如,当“slug”是一个翻译字段时,我想有:

    MyModel.objects.filter(slug="foo")

作为:

    MyModel.objects.fiter(translations__slug="foo")

在引擎盖下。 例如,RelatedField 类的 API 可以做到这一点吗?

我注意到RelatedField 类中有几个API 钩子,例如m2m_reverse_field_name()m2m_target_field_name()m2m_column_name()extra_filters() 等。它们在GenericRelation 和django-taggit 的@ 中使用987654331@ 类,但我不知道这些是如何工作的。

注意django-parler 涵盖了实例的字段访问,我也希望将其扩展到 ORM 查询。

【问题讨论】:

  • 如果你这样修改“过滤器”,你不能将它与指定翻译语言的条件结合起来。您可以替换管理器(可通过名称“objects”访问)并向其添加“your_filter”。我认为它更健壮,您的第一次实验应该使用添加的新过滤器,而不是完全替换。为什么你需要它?对于管理员或任何应用程序? (当我为不使用普通 SQL 的数据库扩展 db 驱动程序时,我深入研究了 ORM 内部结构。)
  • 我不打算修改filter() 方法。相反,请在 RelatedField 方法中提供正确的结果,以便 .filter() 以这种方式运行。

标签: django django-orm django-models django-related-manager


【解决方案1】:

文档说您可以这样做以按特定的翻译字段进行过滤:

MyObject.objects.filter(
    translations__language_code__in=get_active_language_choices(),
    translations__slug='omelette'
)

这应该可以满足您查询特定语言的翻译“slug”字段值的需要。

【讨论】:

  • 是的,这就是我目前使用的。但是,我想为我图书馆的用户提供一个 API,所以他们不必这样做。这需要查看 ORM 内部结构(例如 django-taggit 也是如此),但我找不到任何相关文档
  • 使用custom managers。您可以子类化 django-parler 中使用的自定义管理器
猜你喜欢
  • 1970-01-01
  • 2011-09-14
  • 2014-05-15
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2014-07-10
  • 2019-08-08
相关资源
最近更新 更多