2017-12-07 14 views
0

ネストされたシリアライザを書くためのDjango Restドキュメントに従っていますが、それは私に属性エラーを与えています。ここでAttributeError with Djangoレストネストされたシリアライザ

は私のモデルです:ここでは

class Objects(TimeStampModel): 
    projects = models.ForeignKey(Projects,related_name='proj_obj',on_delete=models.CASCADE) 
    object_name = models.CharField(max_length=50) 
    object_description = models.TextField() 
    object_main_table = models.CharField(max_length=50) 
    object_primary_key = models.CharField(max_length=50) 
    object_age_field = models.CharField(max_length=50) 
    date_format = models.CharField(max_length=50) 

    def __str__(self): 
     return self.object_name 


class ObjectDefinition(TimeStampModel): 
    ATTRIBUTE = 'Attribute' 
    RELATION = 'Relation' 
    TYPE_CHOICES = (
     (ATTRIBUTE, 'Attribute'), 
     (RELATION, 'Relation'), 
    ) 
    obj = models.ForeignKey(Objects,related_name='obj_def',on_delete=models.CASCADE) 
    from_table = models.CharField(max_length=50) 
    from_table_field = models.CharField(max_length=50) 
    to_table = models.CharField(max_length=50) 
    to_table_field = models.CharField(max_length=50) 
    relation_type = models.CharField(max_length=50,choices=TYPE_CHOICES) 
    relation_sequence = models.CharField(max_length=50) 
    value_field = models.CharField(max_length=50, blank=True, null=True) 

は私のserializers.pyスニペットです:

class ObjectDefinitionSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = ObjectDefinition 
     fields = ('from_table','from_table_field','to_table','to_table_field','relation_type','value_field') 

class ObjectSerializer(serializers.ModelSerializer): 
    definition = ObjectDefinitionSerializer(many=True) 
    object_description = serializers.CharField(required=False, allow_null=True, allow_blank=True 
     ) 

    class Meta: 
     model = Objects 
     fields = ('projects','object_name','object_description','object_main_table','object_primary_key','object_age_field','date_format','definition') 

    def validate(self, data, *args, **kwargs): 
     date_format = data.get('date_format') 
     if date_format not in ['YYYYMMDD', 'DDMMYYYY']: 
      msg = ('Date format is incorrect') 
      raise serializers.ValidationError({'error_msg': msg}) 
     return super(ObjectSerializer, self).validate(data, *args, **kwargs) 

    def create(self, validated_data): 
     definition_data = validated_data.pop('definition') 
     obj = Objects.objects.create(**validated_data) 
     for data in definition_data: 
      ObjectDefinition.objects.create(obj=obj, **data) 
     return obj 

私のviews.py:

class CreateObject(CreateAPIView): 
    permission_classes = (IsAuthenticated,) 
    serializer_class = ObjectSerializer 

POST、objects.createを打った後、両方のモデルでうまく動作しますが、objの返り値でこのエラーが表示されます:

例外値:

ガットはAttributeErrorシリアライザObjectSerializerにフィールドdefinitionの値を取得しよう。 シリアライザフィールドの名前が正しくない可能性があり、Objectsインスタンスの属性またはキーと一致しない可能性があります。 元の例外テキストは 'Objects'オブジェクトには属性 'definition'がありませんでした。

私には何が欠けていますか?

答えて

0

ObjectDefinition.objrelated_nameは、シリアライザと一致しないobj_defです。

あなたがソース引数を提供することにより、これを修正することができます

definition = ObjectDefinitionSerializer(source='obj_def', many=True) 
+0

は、はい、私はそれを試してみましたが、それは私を与える:例外の種類:\t KeyError例外 例外値を:\t 「定義」 –

+0

はい、それを持って、する必要があり定義の代わりにobj_defをポップします。今すぐ動作します。したがって、関連する名前フィールドが指定されている場合は、ソース属性が必要です。助けてくれてありがとう。 :) –

+0

本当に、それを逃した。あなたがうまく働いてうれしい。 – Linovia

関連する問題