Post Django Rest框架发布主键uuid或自动生成

Post Django Rest框架发布主键uuid或自动生成,post,django-rest-framework,uuid,Post,Django Rest Framework,Uuid,下面的链接对我帮助很大 因此,通过使用id=serializers.UUIDField()使传递id成为必需。 如果缺少on,它将不再自动生成 此时,我假设在我希望能够发布id的任何序列化程序上,我需要重写Create方法,如果POST数据中没有传递id,则在那里生成新的uuid并保存模型。 这是正确的吗? 或 有没有一种方法可以让DRF同时允许传入和id,或者在没有的情况下自动生成 编辑:我尝试重写Create方法并在不存在的情况下生成一个新的uuid,但看起来好像DRF首先检查数据,然后仍

下面的链接对我帮助很大

因此,通过使用
id=serializers.UUIDField()
使传递id成为必需。 如果缺少on,它将不再自动生成

此时,我假设在我希望能够发布id的任何序列化程序上,我需要重写Create方法,如果POST数据中没有传递id,则在那里生成新的uuid并保存模型。 这是正确的吗? 或 有没有一种方法可以让DRF同时允许传入和id,或者在没有的情况下自动生成

编辑:我尝试重写Create方法并在不存在的情况下生成一个新的uuid,但看起来好像DRF首先检查数据,然后仍然返回

{
 "id": [
 "This field is required."
 ]
}




另外,我不知道这是否完全相关,但我们使用UUID作为主键的模型使用以下内容

模型

定义是什么

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['data']['id']
中检查kwargs的'id'参数,如果它不存在,则在调用超类之前向kwargs添加一个'id'字段

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)
所以现在我可以发布一个指定的id或不

p、 打印语句只是为了调试

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)