我正在尝试更新客户与Django Rest框架,但我得到这个错误:
Field 'id' expected a number but got <User: Chris>.
'Chris'是用户的用户名。
如果我为序列化器删除'pk'和'accounts',这将不会是一个问题,但我需要这些属性为其他函数工作。
它说属性full_name从客户期望一个数字,但得到用户,这是有意义的,但我如何将其转换为用户'id'?
return f'{self.user.first_name} {self.user.last_name}'
Error in formatting: TypeError: Field 'id' expected a number but got <User: Chris>.
这是我的基于类的视图使用RetrieveUpdateAPIView
class staff_customer_details(generics.RetrieveUpdateAPIView):
serializer_class = CustomerSerializer
permissions_classes = [permissions.IsAuthenticated, ]
queryset = Customer.objects.all()
,模型和序列化器是这样的:
class Customer(models.Model):
user = models.OneToOneField(User, primary_key=True, on_delete=models.PROTECT)
rank = models.CharField(choices=RANK_CHOICES, max_length=7)
personal_id = models.IntegerField(db_index=True)
phone = models.CharField(max_length=35, db_index=True)
@property
def full_name(self) -> str:
return f'{self.user.first_name} {self.user.last_name}'
class CustomerSerializer (serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(read_only=True)
accounts = AccountSerializer(many=True, read_only=True)
class Meta:
fields = ('user', 'pk', 'rank', 'personal_id', 'phone', 'accounts', 'can_make_loan', 'full_name')
model = Customer
我认为原因是您在Customer
模型的user
字段中设置了primary_key = True
请删除该属性。然后django将在Customer
模型中设置默认的primary_key字段,即id
。
在CustomerSerializer
中,将pk
改为id
。