我刚刚开始使用Django和Django REST框架。我有以下模型:
class Account(models.Model):
name = models.CharField(max_length=100, blank=False)
vat_perc = models.DecimalField(max_digits=4, decimal_places=2)
def __str__(self):
return "ACCOUNT: {0} -- {1}".format(self.name, str(self.vat_perc))
class Entry(models.Model):
account = models.ForeignKey(Account)
description = models.CharField(max_length=100)
taxable_income = models.DecimalField(max_digits=10, decimal_places=2)
total_amount = models.DecimalField(max_digits=10, decimal_places=2, null=True)
def save(self, *args, **kwargs):
selected_vat = Account.objects.get(pk=self.account).vat_perc
self.total_amount = self.taxable_income * (100.00+selected_vat)/100.00
super(Entry, self).save(*args, **kwargs)
想法是读取用户刚刚选择的账户记录中的vat_perc值,并进行计算以确定total_amount值,然后保存在数据库的entry记录中(我知道有些人会认为这种方法不够优化,因为数据库中存在数据重复,请仍然请跟着我)。
当请求序列化时,应定期对total_amount字段进行序列化。相反,反序列化时序列化器不应执行任何操作,因为模型中save方法的覆盖会在创建或修改时更新值。如果我正确理解了文档,所有这些都意味着将序列化器类中的total_amount字段设置为read_only。
现在,这些是我的序列化器:
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = ('id', 'name', 'vat_perc',)
class EntrySerializer(serializers.ModelSerializer):
class Meta:
model = Entry
fields = ('id', 'account', 'description', 'taxable_income', 'total_amount',)
total_amount = serializers.ReadOnlyField()
# alternatively: total_amount = serializers.FloatField(read_only=True)
但是我得到的错误是:
调用Entry.objects.create()时出现了TypeError。这可能是因为您在序列化器类上有一个可写字段,该字段不是Entry.objects.create()方法的有效参数。您可能需要将字段设置为只读,或覆盖EntrySerializer.create()方法以正确处理此问题。 原始异常文本为:int() argument must be a string, a bytes-like object or a number, not 'Account'。 对我来说,最后一句话听起来特别难懂。我有什么误解吗?有什么提示吗? 提前致谢。