class budgetSerializer(serializers.ModelSerializer):
budget_used = serializers.SerializerMethodField()
budget_remain = serializers.SerializerMethodField()
total_budget = serializers.IntegerField(default=250000)
def get_budget_used (self,obj):
budget_used=budget.objects.filter(user=obj.user).aggregate(Sum('budget_stord__bytes'))
data = []
for val in budget_used.items():
if val.value > total_budget :
raise serializers.ValidationError('you exceed the total budget limit')
return f'budget : {(budget_used/1000)} '
def get_total_budget(self,obj):
total_budget = 250000
return f'total_budget: {(total_budget/1000)} '
def get_remain(self,obj):
remain = (total_budget) - (budget_used)
return remain
class Meta:
model = budget_u
fields = ("budget_used","total_budget","budget_remain")
MODEl
class budget_u(CreatedModel, UUIDPKModel):
budget_stord = models.ForeignKey('bud.Store', on_delete=models.SET_NULL, null=True, blank=True)
user = models.ForeignKey('user.user', on_delete=models.SET_NULL, null=False, blank=False)
I need output like
{
" budget_used": "100",
"remain": "150G",
"total_budget": "250"
}
getting AttributeError: 'tuple' object has no attribute 'value'
You do not access the value with .value
, .items()
returns an iterable of 2-tuples, so you can use iterable unpacking in the for
loop. But here you can simply use subscripting to access the value:
def get_budget_used(self, obj):
budget_used = budget_u.objects.filter(
user=obj.user
).aggregate(total=Sum('budget_stord__bytes'))['total'] or 0
if budget_used > 250000:
return 'you exceed the total budget limit'
return f'budget : {(budget_used/1000)}'
That being said, it is rather odd to each time return strings. Often serializers return numeric data, since that is easier to process, for example by a JavaScript script at the browser side, or an integration of the client.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras