【问题标题】:Django REST: Cannot add (write) nested itemDjango REST:无法添加(写入)嵌套项
【发布时间】:2013-11-27 03:16:07
【问题描述】:

我正在尝试发布与 Django REST Framework (2.3.9) 的嵌套关系,但出现此错误:

ValueError:无法添加“”:实例在数据库“默认”上,值在数据库“无”上

似乎 Django (1.6) 没有认识到我的 HeartbeatSerializerItemSerializer 有任何了解

{
    "username":"testing",
    "heartbeat": {
        "items": [
            {
                "item_date": "2013-11-24T05:08:12Z", 
                "item_title": "disagreeing post", 
                "item_type": "post", 
                "item_karma": 25
            }
        ]
    }
}

这是 serializers.py:

class ItemSerializer(serializers.ModelSerializer):
    '''
        Item Serializer

        Items are User-generated Content which are captured 
        from various APIs made available from the Web or 
        Internet via REST consumed endpoints or Websites 
        which have been scraped.
    '''

    class Meta:
        model = Item
        # fields = ('id', 'item_title', 'item_karma',
        #           'item_type', 'item_date', )


class DepthPatchSerializer(serializers.ModelSerializer):
    def __init__(self, model=None, **kwargs):
        if model is not None:
            self.Meta.model = model
        super(DepthPatchSerializer, self).__init__(**kwargs);
    def get_nested_field(self, model_field):
        return DepthPatchSerializer(model=model_field.rel.to)


class HeartbeatSerializer(DepthPatchSerializer):
    '''
        Heartbeat Serializer

        Items are User-generated Content (USG) containers which are used
        to consolidate normalized User-generated Interactions (USI).
    '''

    # items_queryset = Item.objects.all()
    # items = ItemSerializer(items_queryset, many=True)

    class Meta:
        model = Heartbeat
        # fields = ('id', 'items', )
        depth = 1


class HackerAddSerializer(serializers.ModelSerializer):
    '''
        User Serializer

        Each User is stored in the system itself for analysis and signaling.

        We store users such that subsets of user behavior through USG can be
        generated and analyzed.
    '''

    heartbeat = HeartbeatSerializer()

    def _save_heartbeat_data(self):
        heartbeat_data = self.init_data.get('heartbeat', None)
        if heartbeat_data:
            hs = HeartbeatSerializer(instance=self.object.heartbeat,
                                    data=heartbeat_data)
            import pdb; pdb.set_trace()  # XXX BREAKPOINT
            if hs.is_valid():
                self.object.heartbeat = hs.object
                hs.save()
            else:
                raise Exception(hs.errors)

    def save(self):
        self._save_heartbeat_data()

        password = self.init_data.get('password', None)
        confirm = self.init_data.get('confirm', None)
        if password and password == confirm:
            self.object.set_password(password)

        super(HackerAddSerializer, self).save()
        return self.object

    class Meta:
        model = Hacker
        exclude = ['last_login', 'password',
                'is_superuser', 'is_staff',
                'is_active', 'user_permissions',
                'groups', ]

【问题讨论】:

  • 我使用了stackoverflow.com/a/18842609/412244,它使用了NestedManyToManyField
  • 看看我在类似帖子上写的这个答案:Similar post answered希望它会帮助你。
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

标签: django django-rest-framework


【解决方案1】:

嵌套序列化程序目前是只读的(开箱即用)。您必须编写自己的转换方法来支持可写嵌套序列化程序 (see docs)。

在 django rest 框架项目中实现了可写的嵌套序列化程序。

相反,我建议您使用 RelatedField(如 PrimaryKeyRelatedFieldHyperlinkedRelatedField)来引用嵌套模型。当您将数据序列化到客户端时,您可以使用depth 选项嵌套这些相关字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多