2016-07-01 8 views
1

私はJSONの構造を変更することが可能かどうか疑問に思っています。 currenylyそれは次のようになります。シリアライズされたJSONの構造を変更する方法django rest framwork

{ 
    "para_subject": { 
     "discipline": "MATAN" 
    }, 
    "para_room": { 
     "room": "210" 
    }, 
    "para_professor": { 
     "user": { 
      "username": "yyyy", 
      "email": "[email protected]", 
      "first_name": "yyyy", 
      "last_name": "yyy" 
     }, 
     "middle_name": "xxxxxx" 
    }, 

} 

これにそれを変更するための最良の方法です:

{ 
    "discipline": "MATAN", 
    "room": "210", 
    "para_professor": { 
     "username": "yyyy", 
     "email": "[email protected]", 
     "first_name": "yyyy", 
     "last_name": "yyy" 
     "middle_name": "xxxx" 
     }, 
    } 

はUPDATE: はコメントでリクエストに時

オブジェクトをシリアライザとモデルを追加シリアライザ:

class ParaSerializer(serializers.ModelSerializer): 
    para_subject = DisciplineSerializer() 
    para_room = RoomSerializer() 
    para_professor = ProfessorProfileForScheduleSerializer(read_only=True) 
    para_number = ParaTimeSerializer() 
    para_day = WorkingDaySerializer() 
    # para_group = StudentGroupSerializer() 

    class Meta: 
     model = Para 
     fields = (
      'para_subject', 
      'para_room', 
      'para_professor', 
      'para_number', 
      'para_day', 
      'para_group', 
      'week_type' 
     ) 

オブジェクトM odel:

class Para(models.Model): 

    class Meta(object): 
     verbose_name = u"Class" 
     verbose_name_plural = u"Classes" 

    para_subject = models.ForeignKey(
     'Disciplines', 
     blank=True, 
     null=True, 
     verbose_name=u"Discipline" 
    ) 
    para_room = models.ForeignKey(
     'Rooms', 
     blank=True, 
     null=True, 
     verbose_name=u"Room" 
    ) 
    para_professor = models.ForeignKey(
     'students.ProfileModel', 
     blank=True, 
     null=True, 
     verbose_name=u"Professor" 
    ) 
    para_number = models.ForeignKey(
     'ParaTime', 
     blank=True, 
     null=True, 
     verbose_name=u"Class Starts/Ends" 
    ) 
    para_day = models.ForeignKey(
     WorkingDay, 
     blank=True, 
     null=True, 
     verbose_name=u"Working day") 

    para_group = models.ForeignKey(
     'StudentGroupModel', 
     blank=True, 
     null=True, 
     verbose_name=u"Student Group" 
    ) 
    week_type = models.BooleanField(
     default=True, 
     verbose_name=u"Is week even" 
    ) 

    def __unicode__(self): 
     return u"%s %s" % (self.para_subject, self.para_room) 
+0

シリアライザと対応するモデルを追加してください。 –

+0

完了。コードの他の部分が私がやっていることに似ている –

答えて

1

パラメータをParaSerializerに設定して、disciplineフィールドとroomフィールドを追加できます。

これらのフィールドは、上記のsourceから値を取得し、出力に含まれます。

class ParaSerializer(serializers.ModelSerializer) 
    # define 'discipline' and 'room' fields 
    discipline = serializers.CharField(source='para_subject.discipline', read_only=True) 
    room = serializers.CharField(source='para_room.room', read_only=True) 

    class Meta: 
     model = Para 
     fields = (
      'discipline', # include this field 
      'room', # include this field 
      'para_professor', 
      'para_number', 
      'para_day', 
      'para_group', 
      'week_type' 
     ) 
+0

感謝を探しているため:( –

2

それはあなたが使用するシリアライザ/モデルの依存するが、一般的にはこのように見えるシリアライザ使用することができます:あなたはDjangoの残りのフレームワークのネストされたシリアライザのドキュメントを見つけることができます。ここ

class Serializer1(serializers.Serializer): 
    discipline = serializers.CharField() 
    room = serializers.IntegerField() 
    para_professer = Serializer2() 

class Serializer2(serializers.Serializer): 
    username = serializers.CharField() 
    email = serializers.CharField() 
    first_name = serializers.CharField() 
    last_name = serializers.CharField() 
    middle_name = serializers.CharField() 

http://www.django-rest-framework.org/api-guide/relations/#nested-relationshipsあなたのシリアライザの.to_representation()メソッド上書きする可能性があなたの質問に新しいに関する情報に基づいて

class ParaSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Para 
     fields = (
      'para_subject', 
      'para_room', 
      'para_professor', 
      'para_number', 
      'para_day', 
      'para_group', 
      'week_type' 
     ) 

    def to_representation(self, instance): 
     return { 
      'discipline': instance.para_subject.name, 
      'room': instance.para_room.number, 
      'para_professor': { 
       'username': instance.para_professor.username, 
       'email': instance.para_professor.email, 
       'first_name': instance.para_professor.first_name, 
       'last_name': instance.para_professor.last_name, 
       'middle_name': instance.para_professor.middle_name 
      } 
     } 
+0

が必要であるかどうか私に教えてください。しかし、モデルには、この影響の原因と思われる多くの外部キーの関係があります。このモデルのモデルとシリアライザでチケットを更新しました。 –

+0

はSlugRelatedFieldの表情を持っている:http://www.django-rest-framework.org/api-guide/relations/#slugrelatedfield –

+0

私はそれに用 –

関連する問題