简体   繁体   English

django rest框架嵌套对象

[英]django rest framework nested objects

I'm trying to find an elegant solution to this problem encountered using the Django REST framework. 我正在尝试使用Django REST框架找到遇到此问题的优雅解决方案。 We have a parent model with a child object and a one to one relationship. 我们有一个带有子对象和一对一关系的父模型。 Our requirements are that the child object is optional, can be null and can also be patched to null from a previously existing value. 我们的要求是子对象是可选的,可以为null,也可以从先前存在的值修补为null。 Additionally, if the parent object is deleted the child object should be as well. 此外,如果删除父对象,则子对象也应该是。

This simple set-up that recreates the problem: 这个简单的设置可以重现问题:

class ChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = Child


class ParentSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Parent

    parent_value = serializers.CharField(required=False, max_length=1024)
    child = ChildSerializer(read_only=False, required=False, many=False)


class Parent(models.Model):
    class Meta:
        app_label = "testparent"

    parent_value = models.CharField(max_length=1024, null=True, blank=True)


class Child(models.Model):
    class Meta:
        app_label = "testparent"

    child_value = models.CharField(max_length=1024, null=True, blank=True)
    parent = models.ForeignKey(Parent, null=True, blank=True, related_name="child")


class ParentViewSet(viewsets.ModelViewSet):
    permission_classes = (AllowAny,)

    queryset = Parent.objects.all()
    serializer_class = ParentSerializer

This works: 这有效:

{
    "parent_value": "abc", 
    "child": { "child_value": "something" }
}

This gets an error: 这会出错:

{
    "parent_value": "abc", 
    "child": null
}

Note that the child object is optional and by default the REST framework populates the field with null. 请注意,子对象是可选的,默认情况下,REST框架使用null填充该字段。

I'm using Django v.1.5.4 and REST framework v.2.3.13 我正在使用Django v.1.5.4和REST框架v.2.3.13

The error: 错误:

Traceback:
File "{site-packages}/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "{site-packages}/rest_framework/viewsets.py" in view
  78.             return self.dispatch(request, *args, **kwargs)
File "{site-packages}/django/views/decorators/csrf.py" in wrapped_view
  77.         return view_func(*args, **kwargs)
File "{site-packages}/rest_framework/views.py" in dispatch
  400.             response = self.handle_exception(exc)
File "{site-packages}/rest_framework/views.py" in dispatch
  397.             response = handler(request, *args, **kwargs)
File "{site-packages}/rest_framework/mixins.py" in create
  54.             self.object = serializer.save(force_insert=True)
File "{site-packages}/rest_framework/serializers.py" in save
  596.             self.save_object(self.object, **kwargs)
File "{site-packages}/rest_framework/serializers.py" in save_object
  1023.                     setattr(obj, accessor_name, related)
File "{site-packages}/django/db/models/fields/related.py" in __set__
  474.         manager.add(*value)


Exception Value: add() argument after * must be a sequence, not NoneType

The workaround we're currently using is to have a OneToOne field for parent and then use a post_delete signal handler to delete the child object. 我们当前使用的解决方法是为父级提供OneToOne字段,然后使用post_delete信号处理程序删除子对象。 This feels very hacky. 这感觉非常hacky。 We've in general have encountered a few issues with trying to manipulate nested objects and are wondering if we're going about it wrong or if maybe in this case we've encountered a bug in either django or the rest framework. 我们一般在尝试操作嵌套对象时遇到了一些问题,并且想知道我们是否错了,或者在这种情况下我们遇到了django或其他框架中的错误。

Thanks! 谢谢!

While this question was asked a year ago, Django Rest Framework has released a major update (3.1.1) since then which simplifies and enhances how the framework deals with nested objects. 虽然这个问题是在一年前提出的,但Django Rest Framework自那时起发布了一个重大更新(3.1.1),它简化并增强了框架处理嵌套对象的方式。

Your requirements: 您的要求:

  1. One to One relationship - In the parent Serializer definition, you can specify the paramter many=False . 一对一关系 - 在父级串行器定义中,您可以指定参数many=False

  2. Delete a Child Object when a Parent is deleted - In the Parent Serializer, implement the perform_destroy function. 删除父项时删除子对象 - 在父序列化程序中,实现perform_destroy函数。 In this function, delete the Parent instance and Child instance. 在此函数中,删除Parent实例和Child实例。

Here is the DRF Serializer documentation 这是DRF Serializer文档

您是否尝试在ChildSerializer中设置allow_null = True?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Django Rest Framework 3中验证复杂的嵌套对象 - Validation of complex nested objects in Django Rest Framework 3 Django REST Framework POST 嵌套对象 - Django REST Framework POST nested objects Django Rest Framework可写嵌套序列化器,具有多个嵌套对象 - Django Rest Framework writable nested serializer with multiple nested objects 基于 JSONField 嵌套对象的 Django Rest Framework 过滤器 - Django Rest Framework filter on the base of JSONField nested objects Django Rest Framework 序列化程序嵌套对象内部服务器错误 500 - Django Rest Framework serializer nested objects internal server error 500 Django Rest Framework-嵌套对象无法正确生成 - Django Rest Framework - nested objects not being generated properly Django rest框架以编程方式填充嵌套对象的字段 - Django rest framework populate fields of nested objects programmatically Django REST框架:将嵌套的JSON拼接到许多对象 - Django REST Framework: Flatten nested JSON to many objects 在Django Rest Framework中使用预先存在的对象创建嵌套序列化程序的问题 - Issues creating a nested serializer in Django Rest Framework with pre existing objects 在Django Rest Framework 3中使用可写的嵌套序列化程序创建多个对象 - create multiple objects using writable nested serializers in django rest framework 3
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM