Django Rest Framework post 主键 uuid 或自动生成
Django Rest Framework post primary key uuid or autogenerate
以下link对我帮助很大
因此,使用 id = serializers.UUIDField()
需要传递 ID。
如果缺少 on,它将不再自动生成。
此时我假设在任何序列化器上我希望能够 POST 一个 id,我需要重写 Create 方法,如果在 post 数据中没有传递任何 ID,在那里生成一个新的 uuid 并保存模型。
这个对吗?
要么
有没有一种方法 DRF 可以同时允许传入和 id 或者如果不是则自动生成?
编辑:我尝试重写 Create 方法并生成一个新的 uuid(如果它不存在),但看起来好像 DRF 正在首先检查数据并且仍然 returns
{
"id": [
"This field is required."
]
}
P.s。我不知道这是否完全相关,但我们使用 UUID 作为主键的模型正在使用以下
型号
class Company(models.Model):
id = PGUUIDField(primary_key=True)
和定义
class PGUUIDField(CharField):
def __init__(self, *args, **kwargs):
kwargs.setdefault('editable', not kwargs.get('primary_key', False))
kwargs.setdefault('default', uuid.uuid4)
kwargs.setdefault('max_length', 36)
super(PGUUIDField, self).__init__(*args, **kwargs)
def deconstruct(self):
name, path, args, kwargs = super(PGUUIDField, self).deconstruct()
# Only include kwarg if it's not the default
return name, path, args, kwargs
def db_type(self, connection=None):
return 'uuid'
def get_db_prep_value(self, value, *args, **kwargs):
return self.to_python(value)
def to_python(self, value):
if not value:
return None
if not isinstance(value, uuid.UUID):
value = uuid.UUID("%s"%value)
return value
答案:
我可以覆盖 init 方法并检查 kwargs 在 kwargs['data']['id']
中是否有 'id' 参数,如果它不存在,则添加一个 'id' 在调用 super class.
之前将字段添加到 kwargs
class ControllerSerializer(serializers.ModelSerializer):
id = serializers.UUIDField()
class Meta:
model = Controller
fields = ('id', 'name', 'other_id')
def __init__(self, *args, **kwargs):
if kwargs['context']['request'].method == "POST":
try:
kwargs['data']['id']
except:
kwargs['data']['id'] = uuid.uuid4()
super(ControllerSerializer, self).__init__(*args, **kwargs)
所以现在我可以 POST 是否使用指定的 id!!!!
p.s。打印语句仅用于调试
以下link对我帮助很大
因此,使用 id = serializers.UUIDField()
需要传递 ID。
如果缺少 on,它将不再自动生成。
此时我假设在任何序列化器上我希望能够 POST 一个 id,我需要重写 Create 方法,如果在 post 数据中没有传递任何 ID,在那里生成一个新的 uuid 并保存模型。 这个对吗? 要么 有没有一种方法 DRF 可以同时允许传入和 id 或者如果不是则自动生成?
编辑:我尝试重写 Create 方法并生成一个新的 uuid(如果它不存在),但看起来好像 DRF 正在首先检查数据并且仍然 returns
{
"id": [
"This field is required."
]
}
P.s。我不知道这是否完全相关,但我们使用 UUID 作为主键的模型正在使用以下
型号
class Company(models.Model):
id = PGUUIDField(primary_key=True)
和定义
class PGUUIDField(CharField):
def __init__(self, *args, **kwargs):
kwargs.setdefault('editable', not kwargs.get('primary_key', False))
kwargs.setdefault('default', uuid.uuid4)
kwargs.setdefault('max_length', 36)
super(PGUUIDField, self).__init__(*args, **kwargs)
def deconstruct(self):
name, path, args, kwargs = super(PGUUIDField, self).deconstruct()
# Only include kwarg if it's not the default
return name, path, args, kwargs
def db_type(self, connection=None):
return 'uuid'
def get_db_prep_value(self, value, *args, **kwargs):
return self.to_python(value)
def to_python(self, value):
if not value:
return None
if not isinstance(value, uuid.UUID):
value = uuid.UUID("%s"%value)
return value
答案:
我可以覆盖 init 方法并检查 kwargs 在 kwargs['data']['id']
中是否有 'id' 参数,如果它不存在,则添加一个 'id' 在调用 super class.
class ControllerSerializer(serializers.ModelSerializer):
id = serializers.UUIDField()
class Meta:
model = Controller
fields = ('id', 'name', 'other_id')
def __init__(self, *args, **kwargs):
if kwargs['context']['request'].method == "POST":
try:
kwargs['data']['id']
except:
kwargs['data']['id'] = uuid.uuid4()
super(ControllerSerializer, self).__init__(*args, **kwargs)
所以现在我可以 POST 是否使用指定的 id!!!!
p.s。打印语句仅用于调试