django rest framework: 'NoneType' 类型的对象在调用相关 table 的 get 方法时没有 len()

django rest framework: object of type 'NoneType' has no len() when calling get method of related table

我正在为我项目的 saving/managing 客户数据构建一个 django rest api。我有两个模型。 Customer 用于存储基本的客户详细信息,CustomerDetails 用于存储一堆客户详细信息。我想为两个模型写一个 api 到 create/update 数据。

现在我的代码正在保存用户数据。但是我现在无法获取客户数据。当我调用get方法时,出现如下错误。

TypeError at /api/v1/customer
object of type 'NoneType' has no len()
Request Method: GET
Request URL: http://127.0.0.1:8000/api/v1/customer

此外,我是否需要做任何额外的事情才能使用此代码进行更新 (PUT)

urls.py

router.register(r'customer', views.CustomerViewSet, 'customers')

models.py

class Customer(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=20)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=256)
    """some more fields to go"""


# Create your models here.
class CustomerDetails(models.Model):
    customer = models.OneToOneField(Customer,  on_delete=models.CASCADE,    primary_key=True, )

    spouse_name = models.CharField(max_length=256)
    interests = models.CharField(max_length=256)
    """many more fields to go"""

serializers.py

class CustomerDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomerDetails
        fields = ('spouse_name',)


class CustomerSerializer(serializers.ModelSerializer):
    customer_details = CustomerDetailsSerializer( required=True)
    class Meta:
        model = Customer
        fields = ('name', 'city', 'customer_details', )

    def create(self, validated_data):
        request = self.context.get('request')
        user = request.user
        # create user
        customer = Customer.objects.create(
            user = user,
            name = validated_data['name'],
            city = validated_data['city'],
            # etc ...
        )
        print(json.dumps(validated_data, indent=4))
        customer_details_data = validated_data.pop('customer_details')
        # create profile
        customer_details = CustomerDetails.objects.create(
            customer = customer,
            spouse_name = customer_details_data['spouse_name'],

        )
        customer.customer_details = customer_details_data;
        return customer


class CustomerListSerializer(serializers.ModelSerializer):
    model = Customer
    customer_details = CustomerDetailsSerializer()
    class Meta:
        model = Customer
        fields = '__all__'

views.py

class CustomerViewSet(viewsets.ModelViewSet):
    customer_photo_thumb = Customer.get_thumbnail_url
    customer_details = ''
    permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

    def get_queryset(self):
        queryset = Customer.objects.all()

    def get_serializer_class(self):
        if self.action == 'list' or self.action == 'retrieve':
            return CustomerListSerializer
        return CustomerListSerializer

你的方法.get_queryset return None 像这样替换:

def get_queryset(self):
    return Customer.objects.all()

事实上,您的 get_queryset 方法不是必需的,因为查询集属性不会更改。