【问题标题】:How QuerySets are evaluated in Django?在 Django 中如何评估 QuerySet?
【发布时间】:2023-04-05 12:14:01
【问题描述】:

我有以下型号:

class Product(models.Model):
    """
    Basic product
    """

    name = models.CharField(max_length=100, db_column='name', unique=True)
    url = models.SlugField(max_length=100, db_column="url", unique=True, db_index=True)
    description = HTMLField(db_column='description')
    category = models.ForeignKey(Category, db_column='category', related_name='products')

class FirstObject(Product):
    pass

class FirstProduct(models.Model):
    product = models.ForeignKey(FirstObject, db_column='product')
    color = models.ForeignKey(Color, db_index=True, db_column='color')

class SecondObject(Product):
    pass

class SecondProduct(models.Model):
    product = models.ForeignKey(SecondObject, db_column='product')
    diameter = models.PositiveSmallIntegerField(db_column='diameter')

换句话说,我有两种不同类型的产品(具有不同的参数)。

我想为特定类别(类别中只能是一种产品,我知道是什么)选择具有适当参数的所有产品。

如何有效地完成这项工作?

如果我编写 Category.objects.get(id=id).products.all() 然后使用相关的管理器来获取特定产品的参数,是否意味着每个产品都会命中数据库?

第二种方法是在一个查询中获取所有产品,然后获取所有参数。 然后将它们分组到列表/字典中。

什么方法最好?或者也许还有其他方法?

谢谢。

【问题讨论】:

  • 为什么是FirstObjectSecondObject
  • 因为第一个对象(如电话)有不同的修改。所以在FirstProduct中会有Phone red和Phone black。

标签: django orm django-queryset


【解决方案1】:

您的架构确实不适合查询。您将很快遇到最坏情况的查询行为(对产品的每种类型的修改 2 个查询。我建议您查看 django-shop-simplevariations 的架构,看看他们如何能够实现快速查找(提示,架构为使 prefetch_related 生效而结构化)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2020-10-01
    相关资源
    最近更新 更多