【问题标题】:How to set arbitrary id-like key?如何设置任意 id-like 键?
【发布时间】:2016-05-20 08:56:54
【问题描述】:

我怎样才能设置像id 这样的东西,它是唯一的并在创建对象后生成?

我想为每个对象分配标识符,以便user 可以通过此 ID 识别产品,但我不希望它是常规的自动增量 ID,因为我希望它包含 10 位数字。 (我的pk是1,2...inf)。

到目前为止,我已经尝试创建名称的哈希值,但这不是一个好方法。

class Job(models.Model):
    job_id = models.BigIntegerField() # or hash(something)
    customer = models.ForeignKey(User, related_name='orders', help_text=_("Customer"), on_delete=models.CASCADE)
    translator = models.ForeignKey(User, related_name='jobs', null=True, blank=True, help_text=_(u"Translator"))
    price = models.FloatField(null=True, blank=True, help_text=_(u"Price"))

一种可能的方法是创建一个post_savesignal,它会生成随机的 10 位数字,然后检查唯一性,但这可能是非常耗时的解决方案。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您可以改用UUIDField

    用于存储通用唯一标识符的字段。使用 Python 的 UUID 班级。在 PostgreSQL 上使用时,它以 uuid 数据类型存储, 否则在 char(32) 中。

    通用唯一标识符是 AutoField 的一个很好的替代方案 首要的关键。数据库不会为你生成 UUID,所以它是 建议使用默认值:

    import uuid
    from django.db import models
    
    class MyUUIDModel(models.Model):
        id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
        # other fields
    

    你没有提到使用RDMBS,但是PostgreSQL对UUID的支持更好,你可以阅读更多here

    【讨论】:

    • 谢谢,由于项目正在进行中,我不想弄乱 id 和 uuid。我只想要用户的 PK、唯一标识符。那么我必须将primary_key更改为唯一吗?
    • 我不明白。你问了替代方案,就是这样。主键始终是唯一的,请参阅here
    • 不建议将两者混合使用。最好使用 id 或 uuid。
    猜你喜欢
    • 1970-01-01
    • 2012-07-17
    • 2021-01-10
    • 2013-04-19
    • 2011-10-24
    • 2012-07-03
    • 1970-01-01
    • 2018-10-01
    • 2021-08-26
    相关资源
    最近更新 更多