0

私のプロジェクトの顧客データを保存/管理するためのdjango rest apiを構築しています。私は2つのモデルを持っています。基本的な顧客の詳細を保存するための顧客と、顧客の詳細を保存するためのCustomerDetails。私は両方のモデルのデータを作成/更新するための単一のAPIを書いています。django rest framework:関連テーブルのgetメソッドを呼び出すときに 'NoneType'型のオブジェクトにlen()がありません

私のコードは、ユーザーデータを保存しています。しかし、今私は顧客データを得ることができません。 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 

は、私がupdationため、このコード(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""" 

シリアライザを使用して、余分な何かをする必要がありますか.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 
+0

完全なスタックトレースを含めてください –

+0

完全なスタックトレース:http://pastebin.com/K17QmM91 –

答えて

2

あなたの方法は次のように置き換えるNoneを返す.get_queryset:クエリセットの属性は変更されませんので、ごget_queryset方法は必要ありません実際には

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

+0

それは働いた。ありがとう。これで、顧客の詳細のみが返されます。その結果とともに顧客の詳細を返す方法はありますか? –

関連する問題