【问题标题】:Django UUID Field does not autocreate with new entryDjango UUID 字段不会自动创建新条目
【发布时间】:2022-11-29 17:21:51
【问题描述】:

我刚刚添加了一个我想第一次使用 UUID 的新模型。 我在 python 3.8.10 上运行 Django 3.1.3。

发现了一些关于此的问题,我很确定我是根据这些建议做的。但是,当我向该模型添加一个条目时(在 phpmyadmin web-surface 中),UUID 没有被添加,它只是保持为空。但是,当我创建另一个时,出现错误,UUID 字段不允许与其他地方相同(均为空),这意味着至少 unique=True 确实有效。

另一件要提到的事情是,当我使用 VSCode 创建字段时,通常这些字段名会自动完成,但这个字段不是这样。认为这可能会给您提示发生了什么。

我的模型看起来像这样:

from django.db import models
import uuid


class MQTTTable(models.Model):
    
    uuid = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False, unique = True)
    description = models.CharField(max_length= 100, default = None)
    clientID = models.CharField(max_length = 50, default = None)
    mastertopic = models.CharField(max_length = 200, default = None)

【问题讨论】:

    标签: python django


    【解决方案1】:

    default = uuid.uuid4 是 Django ORM 默认值,它不是数据库会为你做的事情,就像 ID 的自动递增一样。因此,如果您通过 phpmyadmin 添加条目,它不会设置 uuid 字段。

    【讨论】:

    • 所以只有当我通过 Django 创建一个条目时,这才会自动插入一个 UUID?有没有办法做到这一点?
    • 取决于您的后端,对于 mysql,UUIDField 只是一个 varchar,没有默认值或额外的。所以不,它不会为您填写 UUID。我认为 Postgres 有一些更复杂的领域,但没有直接的经验。也许您可以通过 phpmyadmin 进行设置,但是我不知道为什么在获得 Django 时要使用 php。你有 Django admin,如果你添加一个条目,它将填充 uuid。那用那个? :)
    • 就个人而言,我会设置 Django 管理员并在 phpmyadmin 上使用它。 docs.djangoproject.com/en/4.0/ref/contrib/admin
    • 多谢!使用这个半年,总是使用 phpmyadmin 面板填充一些测试条目。
    • 我明白 :) 但是也可以为此使用 django admin,或者如果你想使用一些命令行,你可以使用 shell docs.djangoproject.com/en/4.0/ref/django-admin/#shell。通过它你可以做MQTTTable.objects.create(description='Test', clientID='foo', mastertopic='bar'),在数据库中创建对象。 UUID 有一个默认值,所以不需要设置它。
    【解决方案2】:

    您将需要像这样进行迁移以填充现有条目的字段。访问此以了解如何执行此操作。通过创建新对象,该字段会使用 python 方式自动填充。谢谢 Migrations that add unique fields

    您可以访问这个问题,它可以帮助您回答: Automatically fill pre-existing database entries with a UUID in Django

    【讨论】:

      【解决方案3】:

      基本上,您不能在 php 管理面板中添加条目并期望 django 添加 UUID,因为它是由 Django 而不是数据库设置的。您可以尝试在 model.py 文件中实现一个函数并将其序列化为 Charfield 的源,但是在这种情况下您需要 django rest framework

      【讨论】:

        【解决方案4】:

        default = uuid.uuid4 更改为 default = uuid.uuid4()

        【讨论】:

          猜你喜欢
          • 2023-03-03
          • 2016-03-19
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多