Django Rest Framework 发布主键 uuid 或自动生成

2024-01-02

以下链接对我帮助很大

参考 https://stackoverflow.com/questions/31687423/create-uuid-on-client-and-save-primary-key-with-django-rest-framework-and-using

所以,通过使用id = serializers.UUIDField()需要传递 ID。 如果缺少 on,它将不再自动生成。

我假设此时在任何序列化器上我希望能够发布 id,我需要重写 Create 方法,如果发布数据中没有传递 ID,则在那里生成一个新的 uuid 并保存模型。 它是否正确? 或者 有没有一种方法可以让 DRF 允许传入 id 或自动生成(如果不是)?

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

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





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

model

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

Answer:

我可以覆盖init方法并检查 kwargs 中的“id”参数kwargs['data']['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 进行 POST 也可以不使用!!!!

附注print 语句仅用于调试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest Framework 发布主键 uuid 或自动生成 的相关文章

随机推荐