【问题标题】:Django select all values() with nullable related fieldsDjango select all values() 与可为空的相关字段
【发布时间】:2012-06-16 07:09:51
【问题描述】:

我有这样的模型:

class Vendor(models.Model):
    title = models.CharField()

class Product(models.Model):
    ...
    vendor = models.ForeignKey(Vendor, null=True, blank=True)
    stock = models.ManyToManyField(Supplier, through='Stock')

class Stock(models.Model):
    in_stock = models.BooleanField(default=True)
    supplier = models.ForeignKey('catalog.Supplier', related_name='supplier_stock')
    product = models.ForeignKey('catalog.Product', related_name='product_stock')
    priority = models.IntegerField(default=0)

我设计了这样的模型,因为一个产品可以由不同的供应商提供,我需要知道哪个供应商有这个产品的库存。

因此,在我看来,我希望以值的形式获取所有结果,以减少查询数量和一些特定逻辑。它还用不同的Stock 复制了我的产品行,通过在 python 中我将它们分组。

在我看来,我使用:

Product.objects.all().values(
    'id', 'title', 'vendor_code', 'vendor__title', 'price', 
    'product_stock__in_stock', 'stock__title', 'stock__id', 'stock__priority')

由于供应商相关模型的 INNER JOIN 和 null=True,它返回的不是产品模型的所有记录。它只返回设置了供应商参考的值。

如果我使用 'vendor' 而不是 'vendor__title' 它会返回比前一个结果更多的结果,因为在供应商字段中我可以获得 {...'vendor': *id goes here*...}{...'vendor': None...},但我需要 vendor__title 值。那么有什么建议,如何实现呢?

提前致谢

【问题讨论】:

  • 不应该是“product_stock__vendor__title”而不是“vendor__title”
  • 我猜不是,因为 product_stock__ 引用了 Stock 模型。也许它应该是 product_stock__product__vendor__title,但它更复杂,我认为它无法解决这个问题。但是会试试这个
  • 啊,我在看 Stock 类,抱歉
  • 就是这样!从 vendor__title 更改为 product_stock__product__vendor__title 解决了我的问题,所以现在如果供应商存在 - 它返回其标题,否则返回 None

标签: django django-models django-queryset django-orm


【解决方案1】:

vendor__title 更改为product_stock__product__vendor__title 帮助我解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-08-15
    • 2022-12-10
    • 2017-07-05
    • 2021-03-22
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多