尝试在序列化器“”上获取字段“”的值时出现 AttributeError

Nad*_*sen 4 django django-serializer django-rest-framework

我希望能够查看客户的帐户。正如您所看到的,帐户具有客户的外键。这个想法是能够通过嵌套帐户对象查看客户信息,但这给了我一个错误

Got AttributeError when attempting to get a value for field `accounts_items` on serializer `CustomerSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Customer` instance.
Original exception text was: 'Customer' object has no attribute 'Account'.
Run Code Online (Sandbox Code Playgroud)

就像这个例子一样,艺术家对象中的歌曲:

Got AttributeError when attempting to get a value for field `accounts_items` on serializer `CustomerSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Customer` instance.
Original exception text was: 'Customer' object has no attribute 'Account'.
Run Code Online (Sandbox Code Playgroud)
####MODELS####
class Account(models.Model):
    amount = models.FloatField(null=True)
    name = models.CharField(max_length=40)
    account_type = models.CharField(max_length=11, choices = ACCOUNT_TYPES)
    customer_id = models.ForeignKey(Customer, on_delete = models.CASCADE, default = None)
    bank_id = models.ForeignKey(Bank, on_delete = models.CASCADE, default = None)

    def __str__(self):
        return '{} {} {} {} {}'.format(self.amount, self.name, self.account_type, self.customer_id, self.bank_id)


class Customer(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=40)
    phone = models.CharField(max_length=40)
    email = models.EmailField(max_length = 100)
    rank = models.CharField(max_length=11, choices = RANK_TYPES)
    bank_id = models.ForeignKey(Bank, on_delete = models.CASCADE, default = None)

    def __str__(self):
        return '{} {} {} {} {} {} {}'.format(self.id, self.first_name, self.last_name, self.phone, self.email, self.rank, self.bank_id)
Run Code Online (Sandbox Code Playgroud)
###VIEW###
class customer_page(generics.RetrieveUpdateDestroyAPIView):
    queryset = Customer.objects.all()
serializer_class = CustomerSerializer
Run Code Online (Sandbox Code Playgroud)

小智 5

您需要将序列化器更改为:

 
    class AccountSerializer (serializers.ModelSerializer):
    
        class Meta:
            fields = ('id', 'amount', 'name', 'account_type', 'customer_id', 'bank_id')
            model = Account
    
    
    class CustomerSerializer (serializers.ModelSerializer):
        accounts_items = serializers.SerializerMethodField()
    
        class Meta:
            fields = ('id', 'user', 'first_name', 'last_name', 'phone', 'email', 'rank', 'bank_id', 'accounts_items')
            model = Customer
    
        def get_accounts_items(self, obj):
            customer_account_query = models.Account.objects.filter(
                customer_id=obj.id)
            serializer = AccountSerializer(customer_account_query, many=True)
    
            return serializer.data

Run Code Online (Sandbox Code Playgroud)

这应该有效