为了在达到大量数据库记录时进行性能优化,我希望过滤查询中检索到的字段,并在子模型中使用RESOLATED_NAME使用PREFETCH_RESOLATED()获得反向外键.

我有以下"卖家"模式:

class SellerQuerySet(models.QuerySet):
    def annotate_seller_salary(self):
        return self.annotate(seller_salary=F('points')*100)

class SellerManager(models.Manager):
    use_for_related_fields = True
    
    def annotate_seller_salary(self):
        return self.get_queryset().annotate_seller_salary()
    
    def get_queryset(self):
        return SellerReviewQuerySet(model=self.model, using=self._db)

class Seller(models.Model):
    name= models.CharField(max_length=50)
    points= models.IntegerField(default=0)
    address= models.TextField(max_length=100)

和"产品"模式:

class Product(models.Model):
        name= models.CharField(max_length=50)
        quantity= models.IntegerField(default=0)
        seller= models.ForeignKey(Seller, on_delete=models.CASCADE, related_name="seller_products")

我正在试着把所有的产品按卖家分组.但问题是,如果我首先检索产品,然后try 按销售者对其进行分组,我将无法检索"销售者"模型的注释函数.

因此,我需要从检索带有注释的"Sell"对象开始,然后使用prefetch_Related()和Prefetch()来获取产品,该产品使用卖方外键的Related_NAME.但! 问题是,我不想得到所有的"卖方"模型字段.我只需要points个字段和注释属性seller_salary以及与每个"卖家"对象相关联的"产品"对象.

我已经try 了几种方法来过滤"卖方"模型的选定字段,但都不起作用.

我try 使用了值(),如下所示:

sellers=Seller.objects.all().annotate_seller_salary().prefetch_related(Prefetch('seller_products', Product.objects.filter(points__gt=0).order_by('id'))).values('points', 'seller_salary')

但是,每当我像往常一样try 访问"Product"对象时:

for product in sellers.seller_products.all()

它向我显示了一个错误,说"dict object has no attribute 'seller_products'"

或者,只使用(),如下所示:

sellers=Seller.objects.all().annotate_seller_salary().prefetch_related(Prefetch('seller_products', Product.objects.filter(points__gt=0).order_by('id'))).values('points', 'seller_salary')

给我显示了一个错误,写着"Seller has no field named 'seller_salary'"

有什么办法可以解决这个问题吗?或者,有没有其他解决方案可以帮助我以相同的性能达到相同的方法?

推荐答案

从田地里go 掉'seller_salary'个.注释是自动添加的,因此:

sellers = Seller.objects.annotate_seller_salary().prefetch_related(
    Prefetch(
        'seller_products',
        Product.objects.filter(points__gt=0).order_by('id')
    )
).only('points')

Sql相关问答推荐

用于动态查询情况的存储过程常识模式

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

在Postgres中实现合并功能的干净方法,因为当目标/源不匹配时

如何查询jsonb列是一个对象数组?

如何在presto中映射id与名称

在SELECT中将日期格式转换为双周时段

按连续相等值分组排序

当active=1时,是否可以创建id为的唯一索引?

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

在 postgres 中插入或更新 jsonb 数组的对象

在 SQL Server 中合并两个 XML 列

将时间戳四舍五入到最近 10 分钟的查询

列(值不为空)到其他有序列

计算 ID 满足条件的次数

按所选的值将记录分组到不同的列中

如何将输出转换为二维格式?

自动生成计算频率的列

MS ACCESS 错误插入 X(...) 从 A 联合 Select ... 从 B

我需要遍历权重值表并确定每个权重是否有效