2017-11-09 32 views
0

私はすべての顧客データと回答とコメントを取得したいと思います。 これはmodel.py'ListSerializer'タイプのオブジェクトがJSONシリアライズ可能ではありません

class Customer(models.Model): 

name = models.CharField(max_length=200) 
email_address = models.CharField(max_length=200) 
phone_number = models.CharField(max_length=20) 
age = models.SmallIntegerField(default=14) 
remarks = models.ManyToManyField(Remark,null=True,blank=True) 
created_at = models.DateTimeField(auto_now_add=True) 

def __str__(self): 
    return str(self.id) 


class Response(models.Model): 

question = models.ForeignKey(Question) 
customer = models.ForeignKey(Customer) 
response_text = models.CharField(max_length=100, null=True, blank=True) 
created_at = models.DateTimeField(auto_now_add=True) 
uuid = models.UUIDField() 

def __str__(self): 
    return str(self.id) 

これはserializers.py

class ResponseSerializer(ModelSerializer): 
    class Meta: 
    model = Response 
    fields = '__all__' 

class RemarksSerializer(ModelSerializer): 
    class Meta: 
    model = Remark 
    fields = '__all__' 

class CustomerInformationSerializer(ModelSerializer): 
    remarks = RemarksSerializer(many=True) 
    responses = serializers.SerializerMethodField() 

    def get_responses(self, obj): 
    responses = Response.objects.filter(customer=obj) 
    return ResponseSerializer(responses, many=True) 

    class Meta: 
    model = Customer 
    fields = ('name', 'email_address', 'phone_number', 'age', 'remarks', 'responses') 

これはservices.py

def customer_information(company_id=1): 
    cus = Customer.objects.filter(remarks__company_id=company_id) 
    return CustomerInformationSerializer(cus, many=True).data 

これはviews.py

class CustomerInformationView(APIView): 
    def get(self, request): 
    company_id = request.GET.get('company_id', 1) 
    resp = {'data': customer_information(company_id)} 
    return Response(data=resp, status=status.HTTP_200_OK) 

これであるですis url.py

url(r'^customer/$', CustomerInformationView.as_view()), 

この問題が発生しています。どうすればこの問題を解決できますか?親切に私を導く。

Classy Django REST Framework

+0

なぜ低レベルのAPIViewを使用していますか?より高いレベルのビューがここでより適していると思われ、あなたはservices.pyを必要としません。 RetrieveViewを見てください –

+0

'return ResponseSerializer(respond、many = True)'に失敗しました。あなたのserializermethodfieldの 'get_responses'から.dataを追加するだけです。 –

+0

@TheBrewmaster高いレベルのビュー????? –

答えて

0

まずサイドノート、私は私がDjangoのRESTフレームワークを扱う何のためのGREATだと思うのリソースにあなたをポイントしてみましょう。ソースコードを簡単に見つけて、デフォルトの操作をどのように上書きする必要があるかどうかを確認することができるので、素晴らしいリソースです。私が提案する何

私の答え

ではなくAPIViewを使用しての、あなたがListAPIViewを使用することです。

それはこのようになります:

from rest_framework.generics import ListAPIView 


class Customer(models.Model): 
    name = models.CharField(max_length=200) 
    email_address = models.CharField(max_length=200) 
    phone_number = models.CharField(max_length=20) 
    age = models.SmallIntegerField(default=14) 
    remarks = models.ManyToManyField(Remark,null=True,blank=True) 
    created_at = models.DateTimeField(auto_now_add=True) 

    def __str__(self): 
     return str(self.id) 


class Response(models.Model): 
    question = models.ForeignKey(Question) 
    customer = models.ForeignKey(Customer, related_name='responses') 
    response_text = models.CharField(max_length=100, null=True, blank=True) 
    created_at = models.DateTimeField(auto_now_add=True) 
    uuid = models.UUIDField() 

    def __str__(self): 
     return str(self.id) 


class ResponseSerializer(ModelSerializer): 
    class Meta: 
     model = Response 
     fields = '__all__' 


class RemarksSerializer(ModelSerializer): 
    class Meta: 
     model = Remark 
     fields = '__all__' 


class CustomerInformationSerializer(ModelSerializer): 
    remarks = RemarksSerializer(many=True) 
    responses = ResponseSerializer(many=True) 

    class Meta: 
     model = Customer 
     fields = ('name', 'email_address', 'phone_number', 'age', 'remarks', 'responses') 


class CustomerInformationView(ListAPIView): 
    queryset = Customer.objects.all() 
    serializer_class = CustomerInformationSerializer 
    lookup_field = 'remarks__company' 

は、私はあなたのResponseモデルにcustomerフィールドにrelated_nameを追加することによって行われた変更に注意してください。 Djangoのドキュメントmore informationについては、related_nameを参照してください。つまり、Customerモデルにフィールド名としてresponsesを追加して、その関係を逆戻りすることができます。

これはテストされていませんが、get_responsesメソッドを使用することなく、またはservices.pyにする必要はありません。

関連する問題