首页 > 解决方案 > 使用来自模型属性的数据返回响应时出现AttributeError?

问题描述

我得到的完整错误是这个。

Got AttributeError when attempting to get a value for field `name` on serializer `AccountSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Ledger` instance.
Original exception text was: 'Ledger' object has no attribute 'name'.

这是包含我尝试使用的转移属性方法的 Account 模型。

class Account(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    is_loan = models.BooleanField(default=False)

    @classmethod
    def create_account(cls, user, name):
        cls(user=user, name=name).save()

    @property
    def balance(self):
        return Ledger.objects.filter(account=self.pk).aggregate(models.Sum('amount'))['amount__sum'] or '0'

    @property
    def transfers(self):
        return Ledger.objects.filter(account=self.pk).order_by("-timestamp")[:10]

    def __str__(self):
        return f"{self.user} – {self.name} – {self.pk} – {self.is_loan}"

这是我的序列化程序类。

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = '__all__'

这是视图方法。

class Transactions(APIView):
    def get(self, request, pk):
        account = Account.objects.get(pk=pk)
        transactions = account.transfers
        serializer = AccountSerializer(transactions, many=True)

        return Response(serializer.data)

不太明白为什么这会返回错误,但是如果我将帐户变量放在 AccountSerializer 中,它就可以正常工作。

标签: djangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


在您的代码的视图方法(Transactions类)中,

transactions = account.transfers
serializer = AccountSerializer(transactions, many=True)

account.transfers返回一个Ledger对象列表,然后您将传递给这些对象列表,AccountSerializerAccountSerializer用于模型的序列化或反序列化,Account而不是Ledger.

class LedgerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ledger
        fields = '__all__'

LedgerSerializer您需要为您的Ledger模型定义上述内容,并在您的Transactions视图中使用它。


推荐阅读