我在Bcustomer应用程序中有一个扩展django用户模型的客户模型,因此我将保存基本详细信息,例如用户表中的名称和客户表中的剩余数据(城市等)。
节省工作完美。但现在,当我调用GET方法时,它显示以下错误。
/ api / v1 / customer' str'对象没有属性'值'
请求方法:GET
bcustomer / models.py
class BCustomer(models.Model):
customer = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True, blank=True )
address = models.CharField(max_length=50)
city = models.CharField(max_length=256)
state = models.CharField(max_length=50)
user = models.ForeignKey(settings.AUTH_USER_MODEL, db_index=True, on_delete=models.CASCADE, related_name='customer_creator')
# more fields to go
def __str__(self):
# return str(self.name) (This should print first and last name in User model)
class Meta:
app_label = 'bcustomer'
bcusomer / serializers.py
class CustomerDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = BCustomer
fields = ('city', 'phone')
class CustomerSerializer(serializers.ModelSerializer):
customer_details = CustomerDetailsSerializer()
class Meta:
model = get_user_model()
fields = ('id','first_name', 'email', 'customer_details')
def create(self, validated_data):
request = self.context.get('request')
customer_details_data = validated_data.pop('customer_details')
customer_user = get_user_model().objects.create(**validated_data)
BCustomer.objects.create(customer=customer_user, user=request.user, **customer_details_data)
customer_user.customer_details = customer_details_data
return customer_user
class CustomerListSerializer(serializers.ModelSerializer):
model = get_user_model()
fields = '__all__'
class Meta:
model = get_user_model()
fields = '__all__'
bcustomer / views.py
class CustomerViewSet(viewsets.ModelViewSet):
customer_photo_thumb = BCustomer.get_thumbnail_url
permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
queryset = BCustomer.objects.all()
serializer_class = CustomerSerializer
def get_queryset(self):
queryset = BCustomer.objects.all()
return queryset
def get_serializer_class(self):
if self.action == 'list' or self.action == 'retrieve':
return CustomerListSerializer
return CustomerSerializer
bcustomer / urls.py
router.register(r'customer', views.CustomerViewSet, 'customers')
数据发布参数格式
{
"first_name":"Myname",
"email":"testemail@gmail.com",
"customer_details": {
"city":"citys",
"phone":"04722874567",
}
}
答案 0 :(得分:0)
您应该从model
fields
和CustomListSerializer
class CustomerListSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = '__all__'
答案 1 :(得分:0)
customer_details = CustomerDetailsSerializer()
您需要将source参数设置为指向用户模型的客户。最有可能的是:
customer_details = CustomerDetailsSerializer(source='customer')
(或者source='bcustomer'
,不确定它是否颠倒了字段名称或类名。)
不在一边,你根本不需要ListSerializer
。 list
方法会在many=True
上使用CustomerSerializer
参数调用序列化程序,这将正确创建ListSerializer
。