【问题标题】:Getting not not a valid UUID when I migrate in Django当我在 Django 中迁移时获取不是有效的 UUID
【发布时间】:2020-08-17 15:48:38
【问题描述】:

我在 models.py 中添加了一个名为 transaction_id 的字段得到这个错误。 如何防止每次迁移时发生此错误(python manage.py migrate)

 "C:\Users\Benedict\Miniconda3\envs\django3\lib\site-packages\django\db\models\fields\__init__.py", line 2344, in to_python
params={'value': value},
django.core.exceptions.ValidationError: ["'13615773708697' is not a valid UUID."]

此问题已报告Here,但似乎还没有解决方案。 我正在使用 Django 3 + MySQL
models.py

trans_id = uuid.uuid4()
trans_str = trans_id.int
pass_trans = str(trans_str)[:12]
class DuesLevy(models.Model):
    class_of_dues = models.CharField(max_length=30, default=options.CHOOSE, choices=options.CLASS_OF_DUES, blank=True)
    payment_circle = models.CharField(max_length=30, default=options.CHOOSE, choices=options.PAYMENT_CIRCLE)
    payment_option = models.CharField(max_length=30, default=options.CHOOSE, choices=options.PAYMENT_OPTION)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    transaction_id = models.UUIDField(max_length=100, unique=True, null=True, blank=True, editable=False, default=pass_trans)
    payment_channel = models.CharField(max_length=30, default=options.CHOOSE, choices=options.PAYMENT_CHANNEL_TYPE)
    payment_date = models.DateField()
    date_recorded = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    description = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.amount


    def get_absolute_url(self):
        return reverse('backend:detail_dues', kwargs={'pk': self.id})

【问题讨论】:

  • 您预计会发生什么?您将 12 个字符 int 作为 uuid 传递,这不是有效的 uuid。
  • 我想把字符缩短到12个,不行吗,让我用完整的字符试试
  • 只要通过default=uuid.uuid4,你就可以安全又好走(而不是default=pass_trans)。
  • 我在传递 default=uuid.uuid4 后仍然遇到同样的错误,我不能将值缩短到我想要的长度吗?
  • 不,那不是 uuid。

标签: python django


【解决方案1】:

您需要将一个函数传递给models.UUIDFielddefault 参数。 uuid.uuid4 是一个函数,在调用时会返回一个新的 uuid 对象。不要将字符串或整数作为默认参数传递。

如果您想深入了解源代码,以下是Field 的内部工作原理。 https://github.com/django/django/blob/master/django/db/models/fields/init.py#L827

【讨论】:

  • 我创建了一个函数并将其传递给 'default' 参数,但仍然得到相同的错误
  • 链接太少不知道从哪里开始
  • 您无需浏览此链接。您不需要创建自己的函数。传递default=uuid.uuid4 就是您所需要的。如果它不起作用,那么您的迁移/db 状态有问题。有什么例外?
  • 感谢您的回复,就像您说我删除了我的迁移文件并删除了我的数据库然后在字段中传递了default=uuid.uuid4.int,因为我希望它作为整数它工作。
  • 但是我想要的是一个12位的数字,经过一些研究我发现限制UUID的长度是不合适的。这样做的过程引起了我的问题。所以要获得一个随机的 12 位数字,我必须导入 from random import randint
猜你喜欢
  • 2018-06-14
  • 1970-01-01
  • 2018-02-09
  • 2015-10-07
  • 2018-04-22
  • 2021-11-13
  • 2019-02-02
  • 2020-08-10
  • 2017-11-23
相关资源
最近更新 更多