django rest框架:嵌套模型无法正常工作。 ' STR'对象没有属性'值'

时间:2017-03-16 11:28:56

标签: django django-models django-rest-framework django-users django-serializer

我在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",
    }
}

2 个答案:

答案 0 :(得分:0)

您应该从model

中删除fieldsCustomListSerializer
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',不确定它是否颠倒了字段名称或类名。)

不在一边,你根本不需要ListSerializerlist方法会在many=True上使用CustomerSerializer参数调用序列化程序,这将正确创建ListSerializer