[英]Django - Queryset alternative for model method
我正在嘗試檢索通過模型方法獲得並根據另一個模型的屬性進行過濾的一組值。
我有兩個模型:
class Variety(models.Model):
product_group = models.ForeignKey(ProductGroup)
variety_name = models.CharField(max_length=140)
class ProductPart(models.Model):
product = models.ForeignKey(Product)
part = models.ForeignKey(Variety)
qty = models.DecimalField(max_digits=28, decimal_places=2)
def _total_qty_sold(self):
sold = SalesRecord.objects.values().filter(sale_item=self.product)
total_sold = [SalesRecord['sales_qty'] for SalesRecord in sold]
return sum(total_sold) * self.qty
total_qty_sold = property(_total_qty_sold)
在“品種”中,我需要對“ total_qty_sold
中的所有part
與“ variety_name
相匹配的variety_name
,以使我知道在所有“產品ProductPart
條目中已售出了多少品種。
我考慮過使用模型管理器,但是從閱讀文檔開始 ,似乎所有過濾器都必須硬編碼到管理器中。 由於品種的名稱和數量會發生變化,因此這對我來說真的行不通。 我需要根據模型的self
檢索這些值。 有點像:
def _total_sales_of_materials(self):
sold = ProductPart.objects.filter(part=self).values()
total_materials_sold = sum([ProductPart['total_qty_sold'] for ProductPart in sold])
return total_materials_sold
total_sales_of_materials = property(_total_sales_of_materials)
但是我實際上total_qty_sold
這種方式獲得total_qty_sold
。 我需要以某種方式獲取ProductPart.part
與Variety.variety_name
匹配的所有對象的total_sales_of_materials
的所有值。 我是否缺少Django技巧,還是需要通過Python更改方法?
謝謝你
Django queryset具有豐富的自定義功能。 您可以通過多種方式進行自定義。 您應該在這里閱讀文檔,以滿足您的需求。 例如方法-
def _total_sales_of_materials(self):
sold = ProductPart.objects.filter(part=self).values()
total_materials_sold = sum([ProductPart['total_qty_sold'] for ProductPart in sold])
return total_materials_sold
可以打包成一個查詢-
def _total_sales_of_materials(self):
total_sold = ProductPart.objects.filter(part=self).aggregate(Sum('qty'))
return total_sold
此處已提及-https: //docs.djangoproject.com/zh-CN/1.8/ref/models/querysets/#django.db.models.query.QuerySet.aggregate
您還可以使用Q
對象構建動態查詢。
相同的查詢可以寫成-
total_sold = ProductPart.objects.filter(Q(**{'part':self})).aggregate(Sum('qty'))
通過簡單的for循環回到基礎知識:
def _total_sales_of_part_materials(self):
sold = ProductPart.objects.filter(part=self)
total_part_materials_sold = 0
for object in sold:
total_part_materials_sold += object.total_qty_sold
return total_part_materials_sold
total_sales_of_part_materials = property(_total_sales_of_part_materials)
奇跡般有效。 由於某種原因,我認為如果列表理解不起作用,這將行不通。 現在,我了解列表理解功能結合了Django的“ QuerySet”機制,該機制只能與數據庫對象進行交互。
幸運的是,您仍然可以使用老式的for循環來查找該模型方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.