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)