uuid.uuid4() 不以 DJango 形式创建随机 UUID

uuid.uuid4() not creating random UUID in DJango forms

我在 Django 管理中有一个产品创建表单 space。在产品创建表单中,我有一个干净的产品 ID 方法:

forms.py

import UUID
    def clean_pk_product_id(self, *args, **kwargs):
        pk_product_id = uuid.uuid4()
        return pk_product_id

models.py

class dboinv_product(models.Model):
    pk_product_id = models.UUIDField(
        default = uuid.uuid4(),
        primary_key=True,
        null=False
    )

出于某种原因,这不会生成随机 UUID,它将尝试使用 'pre-determined' ID。我试图创建多个新对象,但都抛出相同的错误,指出主键不是唯一的,并给出相同的 UUID > (3e18d2da4f624649a7cfa310108a1421)

我处理此表单验证的方式有问题吗?我不确定 Django 管理员如何处理这些表单...

更新:我没有在这个表单上调用验证,它是由 django 完成的,因为这个表单只用于管理员 space

在您的模型中,默认设置如下:

default = uuid.uuid4()

这里你有调用 uuid.uuid4,其中returns一个uuid然后用作默认值。这不是您想要的。相反,您需要将默认值设置为函数本身,因为它可以接受一个可调用对象:

class dboinv_product(models.Model):
    pk_product_id = models.UUIDField(
        default = uuid.uuid4, # Remove the brackets
        primary_key=True,
        null=False
    )

接下来关于您的功能clean_pk_product_id,我相信它甚至从未使用过。我不认为您允许用户输入 pk_product_id,这意味着您的表单可能没有字段 pk_product_id 因此您声明的方法从未被调用,只是字段默认值被使用了。


Note: Class names should ideally be in PascalCase not snake_case, so dboinv_product is not a great name. Have a look at PEP 8 -- Style Guide for Python Code