簡體   English   中英

Django-模型方法的Queryset替代

[英]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.partVariety.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM