为了在达到大量数据库记录时进行性能优化,我希望过滤查询中检索到的字段,并在子模型中使用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'"
有什么办法可以解决这个问题吗?或者,有没有其他解决方案可以帮助我以相同的性能达到相同的方法?