如何解决使用表字段优化计算并处理可能的 None 值
我有 3 个不同的表:Price
、Recipe
和 Item
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 举报,一经查实,本站将立刻删除。