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
方法不是必需的,因为查询集属性不会更改。
我正在为我项目的 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
方法不是必需的,因为查询集属性不会更改。