Django REST框架:使字段成为可选字段
我的用户可以创建一个或多个包含项目的列表 我正在使用Django REST框架:使字段成为可选字段,django,django-rest-framework,Django,Django Rest Framework,我的用户可以创建一个或多个包含项目的列表 我正在使用django REST framework并对“viewsets.ModelViewSet”进行子类化,以接收json对象list\u项,该项作为外键:list字段 以下是我想做的: 当用户发布第一个项目时自动创建新列表。此时,这会创建一个错误,因为需要列表id 发布列表id应该是可选的(以便用户可以发布到多个列表) 测试代码(简化): 这是我的序列化程序 class ItemSerializer(serializers.ModelSeri
django REST framework
并对“viewsets.ModelViewSet”进行子类化,以接收json
对象list\u项
,该项作为外键
:list字段
以下是我想做的:
- 当用户发布第一个项目时自动创建新列表。此时,这会创建一个错误,因为需要列表id李>
- 发布列表id应该是可选的(以便用户可以发布到多个列表)
class ItemSerializer(serializers.ModelSerializer):
# this works for changing the list but a list field is required when posting
def validate(self, attrs):
if 'list' in attrs:
attrs['list'] = TodayList.objects.create()
class Meta:
model = TodayListItem
fields =('id',
'name',
'user',
'list',
)
使用我的validate
方法,我可以将列表更改为不同的列表,因此我尝试:
如果属性中没有“列表”:
但这不起作用
序列化程序是“截取”帖子并创建列表的正确位置吗?如何使字段成为可选字段 基于Django REST框架手册 字段级验证 您可以通过添加 .验证序列化程序子类的方法。这些是 类似于Django表单上的.clean_u方法,但接受 稍有不同的论点 他们将反序列化属性的字典作为第一个参数, 并将该字典中的字段名作为第二个参数(将 字段名或源参数的值 字段(如果提供) 因此,解决方案是创建如下列表验证方法:
def validate_list(self, attrs, source):
"""
Check that the list is correct or not?
"""
if list not in attrs:
list_item = TodayList.objects.create()
list = list_item.id
return attrs
另一个解决方案是在模型级别,通过覆盖save()
并检查列表id
def save(self, *args, **kwargs):
if self.list is None:
self.list = TodayList.objects.create()
super(TodayListItem, self).save(*args, **kwargs) # Call the "real" save() method.
在序列化程序中,通过将
required
参数传递为False
class UserResponse(ModelSerializer):
response = IntegerField()
meta_data = MetaDataSerializer(allow_null=True, required=False)
您的第二个解决方案部分起作用:我可以创建项目,而无需在json对象中发布列表id,但我必须从
ItemSerializer
中删除列表字段,因此无法使用post设置它。(如果self.list_id为None,我还需要在模型的save方法中使用,因为它是主键)第一个呢?不工作?确保在使用之前先删除validate()函数。还包括文件中的TodayList类。如果你需要什么,请告诉我。
class UserResponse(ModelSerializer):
response = IntegerField()
meta_data = MetaDataSerializer(allow_null=True, required=False)