【问题标题】:AttributeError with Django Rest nested serializer带有 Django Rest 嵌套序列化程序的 AttributeError
【发布时间】:2017-12-07 11:56:16
【问题描述】:

我正在按照 Django Rest 文档编写嵌套序列化程序,但它给了我属性错误。

这是我的模型:

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 sn-p:

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

我的意见.py:

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

点击 POST 后,objects.create 对两个模型都可以正常工作,但在返回 obj 时,它会抛出这个错误:

异常值:

尝试在序列化程序 ObjectSerializer 上获取字段 definition 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Objects 实例上的任何属性或键都不匹配。 原始异常文本是:“对象”对象没有属性“定义”。

我错过了什么?

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    ObjectDefinition.objrelated_nameobj_def,与您的序列化程序不匹配。

    您可以通过提供源参数来解决这个问题:

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

    【讨论】:

    • 是的,我试过了,但它给了我:异常类型:KeyError 异常值:'definition'
    • 是的,需要弹出 obj_def 而不是定义。现在工作。所以如果指定了相关的名称字段,则需要一个源属性!谢谢您的帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2020-03-21
    • 2015-12-16
    • 2016-02-09
    相关资源
    最近更新 更多