微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用表字段优化计算并处理可能的 None 值

如何解决使用表字段优化计算并处理可能的 None 值

我有 3 个不同的表:PriceRecipeItem

class Item(models.Model):
    def __str__(self):
        return self.name

    name = models.CharField(max_length=200,unique=True)
    image = models.URLField()

class Recette(models.Model):
    item = models.OnetoOneField(Item,on_delete=models.CASCADE)

    qte_ressource_1 = models.IntegerField(null=True)
    ressource_1 = models.ForeignKey(Item,on_delete=models.SET_NULL,blank=True,null=True,related_name='ressource_1')

    qte_ressource_2 = models.IntegerField(null=True)
    ressource_2 = models.ForeignKey(Item,related_name='ressource_2')

    qte_ressource_3 = models.IntegerField(null=True)
    ressource_3 = models.ForeignKey(Item,related_name='ressource_3')

    qte_ressource_4 = models.IntegerField(null=True)
    ressource_4 = models.ForeignKey(Item,related_name='ressource_4')

    qte_ressource_5 = models.IntegerField(null=True)
    ressource_5 = models.ForeignKey(Item,related_name='ressource_5')

    qte_ressource_6 = models.IntegerField(null=True)
    ressource_6 = models.ForeignKey(Item,related_name='ressource_6')

    qte_ressource_7 = models.IntegerField(null=True)
    ressource_7 = models.ForeignKey(Item,related_name='ressource_7')

    qte_ressource_8 = models.IntegerField(null=True)
    ressource_8 = models.ForeignKey(Item,related_name='ressource_8')

class Prix_x1(models.Model):
    def __str__(self):
        return self.item.name

    prix = models.IntegerField(null=True)
    saved_at = models.DateTimeField()
    item = models.ForeignKey(Item,on_delete=models.CASCADE)

每个项目都可以有一个配方,一个配方由 1 到 8 个项目组成,每个项目的数量数量相关。 而且所有商品都有价格。

这是我想要的:

对于所有有食谱的物品,我想计算这个食谱的总价,这意味着得到所有成分的价格。问题是我将我的食谱模型定义为最多有 8 种成分,但例如一个食谱只能有 2 种成分,因此其余成分设置为无。

我尝试过类似的东西:

items = Item.objects.all().select_related('recette').exclude(recette__isnull=True).annotate(
    prix1=Subquery(
        Prix_x1.objects.filter(
            item=OuterRef('pk')
        ).values('prix').order_by('-saved_at')[:1]
    )
)

for item in items:
    prix_craft,is_recette_ok = item.recette.get_recette_price()
    prix = item.prix1
    if is_recette_ok and prix:
        gain = prix - prix_craft
        prices.append({'name': item.name,'key': item.pk,'prix_hdv': prix,'prix_craft': prix_craft,'gain': gain,'pourcentage_gain': np.around((gain / prix_craft) * 100)})

我创建了一个这样的 get_recette_price() :

def get_fields(self):
    values = []
    for field in Recette._Meta.fields:
        if field.value_to_string(self) != 'None':
            if field.name not in ('item','id'):
                values.append(int(field.value_to_string(self)))

    return values

def get_recette_price(self):

    fields = self.get_fields()
    quantites = fields[::2]
    ressources = Item.objects.filter(id__in=fields[1::2]).annotate(
        prix1=Subquery(
            Prix_x1.objects.filter(item=OuterRef('pk')).values('prix').order_by('-saved_at')[:1]
        )
    ).values_list('prix1',flat=True)

    is_recette_ok = True
    total = 0
    for quantite,ressource in zip(quantites,ressources):
        if quantite and ressource:
            total += quantite * ressource
        else:
            is_recette_ok = False
            break
    return total,is_recette_ok

但是代码执行起来真的很长。
如果配方没有 8 种成分,我不知道如何优化它并处理 None 值。
感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?