假设我有以下模型:

class Shop(models.Model):
    ...
    @property
    def products_count(self):
        return Product.objects.filter(shop=self).count()

class Product(models.Model):
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    ...

products_count属性用于获取store 中的产品数量.随着Django 5和generated fields的发布,有没有办法用它来存储计数呢?或者我误解了生成的字段的使用?

推荐答案

Django基于GeneratedField with GENERATED ALWAYS语法生成SQL表达式.虽然数据库可能会为聚合实现这一点,但据我所知,目前没有数据库这样做.

例如,PostgreSQL通常附带比其他数据库更多的电池,says in the documentation about generated columns [pgsql-doc]:

生成表达式只能以任何方式使用不可变函数和cannot use subqueries or reference anything other than the current row.

但是,即使我们设想这样一个数据库,它也很可能是无休止递归的秘诀.实际上,如果生成的列将依赖于另一个表,这将意味着对该表的更新将触发第一个表中的更新,但这反过来可能会触发其他更新,并可能最终触发第二个表.因此,一列中的一个小更新可能会导致大量更新,更重要的是,可能会触发一系列永无止境的更新.

我认为在这种情况下,在需要时只注释产品数量可能会更好,因此:

from django.db.models import Count

Shop.objects.annotate(products_count=Count('product'))

并省略该属性,这也将防止N+1 problem.

Django相关问答推荐

与django相关的预取n +1问题.我该怎么解决呢?

AttributeError:';ManyToOneRel&39;对象没有属性';attname';

模仿没有像预期的那样工作(Django)

Django REST序列化程序TO_REATION失败

通过在其他查询中使用来过滤对象

错误404除主要应用程序外,HTML页面无法渲染的其他应用程序

Django: 无法将我的 comments 关联到特定产品

Django 获取用户创建的对象,这些用户属于用户列表

Django ORM __in 但不是精确的,包含不区分大小写的?

django-rest-framework 如何使模型序列化器字段成为必需

Django中基于令牌的身份验证

Django -- User.DoesNotExist 不存在?

Python:获取异常的错误消息

如何使用 Requests 库执行 HTTP DELETE 请求

如何向所有 Django 响应添加 HTTP 标头

Django unique_together 与可为空的 ForeignKey

python/django中setattr和对象操作的区别

Django 在 css 文件中使用背景图像的方法

提供来自 django 的压缩内容

通过 django 分页仅显示部分页码