[英]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: 您的要求:
One to One relationship - In the parent Serializer definition, you can specify the paramter many=False
. 一对一关系 - 在父级串行器定义中,您可以指定参数
many=False
。
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实例。
您是否尝试在ChildSerializer中设置allow_null = True?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.