Django ContentTypes将uuid字段转换为整数字段
我遇到这样一种情况,即Django ContentTypes将uuid字段转换为整数字段,django,postgresql,Django,Postgresql,我遇到这样一种情况,即ForeignKey的object\u id接受PositiveIntegerField,但我的模型的所有id都设置为uuid 我查阅了文档,发现我应该使用get_prep_value(value)或get_db_prep_value(value,connection,prepared=False)^ 问题是我到底应该怎么做 这是包含外国关系的模型代码 target_ct = models.ForeignKey(ContentType,
ForeignKey
的object\u id
接受PositiveIntegerField
,但我的模型的所有id
都设置为uuid
我查阅了文档,发现我应该使用get_prep_value(value)
或get_db_prep_value(value,connection,prepared=False)^
问题是我到底应该怎么做
这是包含外国关系的模型代码
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:整数超出范围
您还可以将其设置为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)
类MyModel(models.Model):
target\u ct=models.ForeignKey(
内容类型,
空白=真,
空=真,
相关的_name='target_obj',
on_delete=models.CASCADE
)
target_id=models.UUIDField(
空=真,
空白=真,
db_index=True
)
target=GenericForeignKey('target\u ct','target\u id')
创建的\u at=models.datetime字段(自动\u now\u add=True,db\u index=True)
然后,您可以引用将UUIDField
作为主键的所有对象
然而,这正是为什么使用自动字段
作为主键通常更好的原因之一:如果所有模型都具有相同的主键,则可以使用该主键引用所有对象。现在,您只能使用UUIDField
作为主键引用模型。我已经尝试过了,当我尝试将其迁移为uuid字段django.db.utils.ProgrammingError:无法将类型integer转换为uuid行1:…“ALTER COLUMN”target_id“type uuid USING”target_id“::uuid
@h1dd3n:问题是您无法更改列类型。您最好先删除列,进行迁移,然后添加新列。