【问题标题】:custom query in djangoDjango中的自定义查询
【发布时间】:2011-03-11 00:38:29
【问题描述】:

我正在建立一个电子商务网站。 我有一个 Product 模型,其中包含所有产品类型共有的信息:

class Product(models.Model):
  name=models.CharField()
  description=models.CharField()
  categories = models.ManyToManyField(Category)

然后我有 SimpleProduct 和 BundleProduct,它们对 Product 具有 FK 并保存特定于产品类型的信息。 BundleProduct 对其他产品有一个 m2m 字段。

class SimpleProduct(Product):
  some_field=models.CharField()

class BundleProduct(Product):
  products = models.ManyToManyField(Product)

显示目录时,我正在对 Product 模型进行一次查询 然后对每个产品进行另一个查询以获取附加信息。 这涉及大量查询。

我可以通过在 simpleproduct 和 bundleproduct 字段上使用 select_related 来改进它。 我可以通过将 select_reverse 应用程序用于类别等 m2m 字段来进一步改进它。

这是一个很大的改进,但需要更多查询,因为 BundleProduct 有多个产品,这些产品也可能与其他产品(可配置产品)有关系。

有没有办法对 Product 进行单个查询来检索 m2m 类别、one2one SimpleProduct 和 BundleProduct 以及 BundleProduct 的产品?

这个自定义查询是否看起来像一个包含所有管理器和属性的 django 查询集?

谢谢

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您可以查看查询集的extra method。可能会让您有机会添加一些额外的字段。但是,如果您想要原始查询,您可以使用经理的raw method,这些将返回一种查询集,但它不会利用普通查询集的全部功能,但应该足以解决您的问题。在同一页面上还显示了 execute 方法,这是针对甚至无法转换为原始查询集的真正自定义 sql。

    【讨论】:

    • extra 和 raw 似乎都向对象添加了额外的字段。是否可以对深层嵌套对象使用原始查询?在我的情况下 product.bundleproduct.products.all()[0].simpleproduct.categories.all()[2] ?
    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 2011-03-04
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2020-06-28
    相关资源
    最近更新 更多