【问题标题】:django rest framework : nested model get not working. 'str' object has no attribute 'values'django rest 框架:嵌套模型无法正常工作。 “str”对象没有属性“values”
【发布时间】:2017-08-07 13:17:41
【问题描述】:

我在 Bcustomer 应用程序中有一个客户模型,它扩展了 django User 模型,所以我将保存基本详细信息,例如用户表中的名称和客户表中的剩余数据(城市等)。

储蓄运作良好。但是现在当我调用GET方法时它显示以下错误。

/api/v1/customer 'str' 对象的 AttributeError 没有属性 'values'

请求方法: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",
    }
}

【问题讨论】:

  • 在CustomeListSerializer 里面为什么有model = get_user_model() 和fields = '__all__'?您已经在Meta class 中拥有它们。

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


【解决方案1】:

您应该从CustomListSerializer 中删除model 和fields

class CustomerListSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = '__all__'

【讨论】:

    【解决方案2】:
    customer_details = CustomerDetailsSerializer()
    

    您需要将源参数设置为指向用户模型的客户。最有可能:

    customer_details = CustomerDetailsSerializer(source='customer')
    

    (或者可能是source='bcustomer',不确定是颠倒了字段名还是类名)。

    另一方面,您根本不需要ListSerializer。 list 方法将使用CustomerSerializer 上的many=True 参数调用序列化程序,这将适当地创建ListSerializer。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 2014-05-21
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多