如何在Django Rest Framework中使用read_only_fields创建数据

xytpbqjk  于 2023-03-24  发布在  Go
关注(0)|答案(1)|浏览(174)

并且面临只读字段的问题假设我有以下serailizer

`class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']
        read_only_fields = ['account_name']`

其中account_name(在Account模型中,此字段不能为null)设置为read_only,因为我不想在创建后更新其数据,但在使用创建数据时,我在序列化程序中传递了account_name,但它排除了account_name并给出错误“account_name”不能为null
任何人都可以给予我解决这个问题,我如何才能创建一个只读字段不能为空的数据
我已经尝试从read_only_field中删除它,但这样做可以更新account_name,但我不想在创建后更新它

8oomwypt

8oomwypt1#

看起来您想让字段account_name对于create API端点是可写的,但是对于update API是只读的。
在这里使用read_only_fields是行不通的,因为DRF总是会忽略为请求中的这些字段发送的任何数据。因此,它需要有条件地处理。
一种(快速)方法是在validate(self, attrs)validate_account_name(self, value)方法中处理此问题。例如:

def validate_account_name(self, value):
    if self.instance.pk:
        return self.instance.account_name
    else:
        return value

如果是一个更新调用,这将基本上为字段分配现有值。
然而,如果你使用的是swagger/openapi之类的文档,这将不会自动反映在文档中。要解决这个问题,你可以在文档中指定请求字段,或者创建两个序列化类(update继承自create method类),并在update类中分配只读字段。然后你需要为它们各自的方法指定合适的序列化类。

相关问题