首页 > 解决方案 > Django ContentTypes 将 uuid 字段转换为整数字段

问题描述

我有一种情况,object_idforForeignKey接受 aPositiveIntegerFieldid's我的所有模型都设置为uuid.

我查阅了文档,发现我应该使用get_prep_value(value)get_db_prep_value(value, connection, prepared=False)¶

问题是我应该怎么做?

这是包含模型的代码foreignRelation

target_ct = models.ForeignKey(ContentType,
                              blank=True,
                              null=True,
                              related_name='target_obj',
                              on_delete=models.CASCADE)
target_id = models.PositiveIntegerField(null=True,
                                        blank=True,
                                        db_index=True)
target = GenericForeignKey('target_ct', 'target_id')

created_at = models.DateTimeField(auto_now_add=True,
                                  db_index=True)

所有其他模型的字段

id = models.UUIDField(default=uuid4, primary_key=True, editable=False)

每当我尝试使用当前设置保存模型时,我都会收到此错误

django.db.utils.DataError:整数超出范围

标签: djangopostgresql

解决方案


您也将其UUIDField设为:

class MyModel(models.Model):
    target_ct = models.ForeignKey(
        ContentType,
        blank=True,
        null=True,
        related_name='target_obj',
        on_delete=models.CASCADE
    )
    target_id = models.UUIDField(
        null=True,
        blank=True,
        db_index=True
    )
    target = GenericForeignKey('target_ct', 'target_id')
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)

然后,您可以引用所有具有 aUUIDField作为主键的对象。

然而,这正是使用 aAutoField作为主键通常更好的原因之一:如果所有模型都具有相同的主键,您可以使用它来引用所有对象。现在有了这个,您只能引用具有 aUUIDField作为主键的模型。


推荐阅读