我正在尝试为我的Django对象获取唯一ID。在Django 1.8中,他们拥有UUIDField。我不确定如何使用此字段为我的模型中的每个对象生成唯一ID。
以下是我对UUIDField的了解
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
class Person(models.Model):
...
unique_id = MyUUIDModel()
我可以重现UUID模型的id,但每次我都会得到完全相同的id。 :(。例如:
person = Person.objects.get(some_field = some_thing)
id = person.unique_id.id
id每次都给我相同的id。有什么问题,我该如何解决这个问题?谢谢你的帮助!
答案 0 :(得分:60)
我不确定您为何创建了UUID模型。您可以将uuid字段直接添加到Person模型。
class Person(models.Model):
unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
每个人都应该有一个唯一的身份证。如果你想将uuid作为主键,你可以这样做:
class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
您当前的代码未向此人添加字段。它在您执行MyUUIDModel()时创建了一个MyUUIDModel
实例,并将其保存为类属性。这样做没有意义,每次加载models.py时都会创建MyUUIDModel
。如果您真的想使用MyUUIDModel,可以使用ForeignKey
。然后每个人都会链接到不同的MyUUIDModel实例。
class Person(models.Model):
...
unique_id = models.ForeignKey(MyUUIDModel, unique=True)
但是,正如我之前所说,最简单的方法是将UUID字段直接添加到此人。
答案 1 :(得分:8)
编辑:其实我错了。尚无法将其实现为 DEFAULT_AUTO_FIELD
,因为它必须继承自 IntegerField
。这是 the ticket in the django project 与功能请求,使其成为可能。一旦解决,我会更新我的答案。
从 Django 3.2 开始,如果您想使用 uuid
作为项目范围级别上所有模型的 pk,则不再需要通用抽象模型。只需定义 DEFAULT_AUTO_FIELD
设置
默认值
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
这样的事情应该可以工作
DEFAULT_AUTO_FIELD = 'django.db.models.UUIDField'
或者更好的是,创建自己的领域。
DEFAULT_AUTO_FIELD = 'project.common.models.CustomUUIDField'
你还定义了 uuid 类型等
如文档中所示,它也可以应用于应用级别。
class MyAppConfig(AppConfig):
default_auto_field = 'project.common.models.CustomUUIDField'
答案 2 :(得分:6)
在声明Person模型时,您需要使用您创建的类作为子类:
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
class Person(MyUUIDModel):
...
这样,Person成为MyUUIDModel的子类,并将继承其id字段定义。
答案 3 :(得分:5)
您可以在id
模型中直接将Person
字段添加为UUIDField
。不需要单独的MyUUIDModel
。
我认为您已将MyUUIDModel
与id
UUIDField
UUIDs
中使用的id
混淆了。您可以使用以下代码,它会import uuid
from django.db import models
class Person(models.Model):
...
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
使用bool VerifyAddress(HANDLE hwnd, DWORD dwAddress, char* bMask, char *szMask )
{
PBYTE *pTemp = { 0 };
for ( int i = 0; *szMask; ++szMask, ++bMask, ++i )
{
try {
if ( !ReadProcessMemory( hwnd, reinterpret_cast<LPCVOID>(dwAddress + i), &pTemp, sizeof(pTemp), 0 ) ){
failedRPM++;
return false;
}
} catch(...) {
failedRPM++;
return false;
}
if ( *szMask == 'x' && reinterpret_cast<char*>(pTemp) != reinterpret_cast<char*>(*bMask)){
failedMask++;
return false;
}
}
return true;
}
DWORD FindPattern(HANDLE hwnd, char* bMask, char *szMask )
{
for ( DWORD dwCurrentAddress = 0x015A1DB4; dwCurrentAddress < 0x7FFFFFF; dwCurrentAddress++ ){
if ( VerifyAddress( hwnd, dwCurrentAddress, bMask, szMask )) {
return dwCurrentAddress;
}
}
return 0x0;
}
。
{
"_id" : ObjectId("55cf3400dd232e1b561b6b2c"),
....
"user" : {
"id" : 1.77202e+08,
...
"screen_name" : "Karunaprof",
},
...
},
{ ... }
答案 4 :(得分:1)
在模型导入 uuid 中:
import uuid
在课堂模型中使用:
uuid = models.UUIDField(editable=False, default=uuid.uuid4, unique=True)
<块引用>
类文章(TimeStampedModel): uuid = models.UUIDField(editable=False, default=uuid.uuid4, unique=True) user = models.ForeignKey(用户,on_delete=models.SET_NULL,related_name='articles',null=True) 类别=models.ManyToManyField(文章类别,空白=真) title = models.CharField(max_length=500, null=True, blank=True) body = RichTextUploadingField(config_name='portal_lobar_config') image = models.ImageField(upload_to='article_images/', null=True, blank=True) 标题=models.BooleanField(默认=真) 标签 = models.ManyToManyField(ArticleTag, blank=True) slug = AutoSlugField(max_length=500, populate_from='title', unique_with='created__month', null=True) 已发布 = models.BooleanField(默认=False) published_at = models.DateTimeField(null=True, blank=True)
def __str__(self):
return self.title
class Meta:
ordering = ['-created']
答案 5 :(得分:0)
要将Django中的UUID用于新模型,请参见Django Docs。
但是,如果您想将其用于具有相应数据的现有模型(具有 unique = True ),则将无法直接使用它通过以上文档。它将创建迁移错误。 要做到这一点而又不会丢失数据,请遵循此Django Documentation的所有步骤。