2017-06-11 15 views
0

Django Rest Frameworkで単純なAPIを実装しようとしています。Django Rest Framework - ネストされたオブジェクトが正しく生成されない

は私がmodels.pyに次のモデルがあります:

class Entry(BaseModel): 
    company_name = models.CharField(max_length=256, null=True, blank=True) 
    first_name = models.CharField(null=True, default=None, max_length=32) 
    last_name = models.CharField(null=True, default=None, max_length=32) 
    code = models.CharField(null=True, default=None, max_length=12) 


    class Meta: 
     db_table = 'entry' 

    class Admin(admin.ModelAdmin): 
     list_display = ('company_name', 'code') 
     list_display_links = ('company_name',) 
     ordering = ('-created',) 


class EntryContactData(BaseModel): 
    entry = models.ForeignKey(Entry, related_name='contact') 
    email = models.CharField(max_length=256, null=True, blank=True) 
    website = models.CharField(max_length=64, null=True, blank=True) 
    phone = models.CharField(max_length=64, null=True, blank=True) 

私のAPIのserializers.py:

from django.contrib.auth.models import User, Group 
from rest_framework import serializers 
from core.models import Entry, EntryContactData 


class EntryContactSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = EntryContactData 
     fields = ('uuid', 'email', 'website', 'phone') 


class EntrySerializer(serializers.ModelSerializer): 
    contact = EntryContactSerializer(many=False, read_only=True) 

    class Meta: 
     model = Entry 
     fields = ('uuid', 'company_name', 'first_name', 'last_name', 'contact') 

そして、私のAPIビュー:私はしたい

from core.models import Entry 
from .serializers import EntrySerializer 


class EntryViewSet(viewsets.ViewSet): 
    """ 
    A simple ViewSet for listing or retrieving users. 
    """ 
    queryset = Entry.objects.all() 

    def retrieve(self, request, pk=None): 
     queryset = Entry.objects.all() 
     entry = get_object_or_404(queryset, code=pk) 
     serializer = EntrySerializer(entry, context={'request': request}) 
     return Response(serializer.data) 

単一のエントリを取得するにはcontactフィールドは空です:

{ 
    "uuid": "e6818508-a172-44e1-b927-3c087d2f9773", 
    "company_name": "COMPANY NAME", 
    "first_name": "FIRSTNAME", 
    "last_name": "LASTTNAME", 
    "contact": {} 
} 

だから、私が間違って何をやっているEntryContactSerializer

で定義されたフィールドのいずれかが含まれていませんか?シリアライザに含まれるすべてのフィールドを返すように強制するにはどうすればよいですか?君たちありがとう。

+0

あなたはエントリがEntryContactDataの鍵が含まれていることを確信していますか?データテーブルを表示してください。 – digitake

答えて

0

EntrySerializerでmany=Trueを設定してみてください、とシリアライザにsource属性を提供し、

class EntrySerializer(serializers.ModelSerializer): 
    contact = EntryContactSerializer(source='contact', many=True, read_only=True) 
    class Meta: 
     model = Entry 
     fields = ('uuid', 'company_name', 'first_name', 'last_name', 'contact') 
関連する問題