Django | model-字段-UUIDField

模型字段中 UUIDField 类型小记

进来在一个小应用中使用了 UUIDField 字段类型,在视图写完跑单元测试时,发现获取的结果和我期望的不一致....。

1 使用 UUIDField

class BaseBackBone(models.Model):
    """model docstring"""
    id = models.UUIDField(primary_key=True, default=UUIDTools.uuid1_hex, editable=False)

    class Meta:
        abstract = True

所使用的 UUIDTools.uuid1_hex 代码如下:

import uuid


class UUIDTools(object):
    """uuid function tools"""

    @staticmethod
    def uuid1_hex():
        """
        return uuid1 hex string

        eg: 23f87b528d0f11e696a7f45c89a84eed
        """
        return uuid.uuid1().hex

2 在终端中跑个测试

http http://127.0.0.1:8000/blog/category/

HTTP/1.0 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Date: Sat, 08 Oct 2016 10:00:01 GMT
Server: WSGIServer/0.2 CPython/3.5.2
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN

[
    {
        "id": "e6e6ddca-8d2d-11e6-85b8-f45c89a84eed",
        "name": "Django"
    }
]

可以看到返回的 id 字段中有横岗,我查了数据库发现,数据库中是没有横杠

e6e6ddca8d2d11e685b8f45c89a84eed

很有意思,存到数据库中时,是不带横杠的,即自定义的函数返回的结果;但是显示时,带有小横杠,哈。

3 产生原因

翻了 Django 源代码

def to_python(self, value):
    if value and not isinstance(value, uuid.UUID):
        try:
            return uuid.UUID(value)
        except ValueError:
            raise exceptions.ValidationError(
                self.error_messages['invalid'],
                code='invalid',
                params={'value': value},
            )
    return value

重点是 return uuid.UUID(value) 这一句,原来如此。

4 解决方法

4.1 直接使用 CharField 字段

直接使用 CharField, 就不存在什么横杠的问题了。

4.2 重写 to_representation 方法

重写对应 serializers 中的 to_representation 方法即可。

4.3 自定义 UUIDField 字段

自定义继承 models.UUIDField 的字段,然后重写 to_python 方法

Django是一个流行的Python Web框架,它允许开发者快速构建安全而可维护的应用程序。当与MySQL数据库结合时,Django提供了一种方便的方式来管理数据表结构,包括自动创建主键(通常用于标识唯一记录)。 在Django中,如果你想要一个包含字母的自动递增序列作为主键,这通常是不可能直接通过Django ORM完成的,因为MySQL的内置自动递增字段通常是整数类型(如INT)。然而,你可以自定义一个模型,并利用Python生成随机字符串,或者使用第三方库如`django-uuidfield`或`django-generic-model-crud`中的CharField,配合一些额外步骤来模拟类似的功能。 例如,你可以创建一个带有CharField的模型: ```python from django.db import models import random import string class AlphabetAutoIncrementModel(models.Model): id = models.CharField(primary_key=True, max_length=6, default=lambda: ''.join(random.choices(string.ascii_uppercase + string.digits, k=6))) # 其他模型字段... def save(self, *args, **kwargs): if not self.pk: # 如果实例还未保存过,设置id self.id = self.generate_id() super().save(*args, **kwargs) @classmethod def generate_id(cls): return cls.objects.all().order_by('-id').first() and str(int(cls.objects.all().order_by('-id')[0].id) + 1) or 'A00001' # 使用示例 ``` 在这个例子中,我们创建了一个CharField的id字段,并在模型保存之前检查是否需要自动生成新的ID。`generate_id`方法会根据现有最大ID生成一个新的、唯一的字符串形式的ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值