django 使用 uuid 主键访问链接模型
django using uuid primary key to access linked models
试图掌握 Django(来自 php 或 .Net 过去)并发现它有点挑战。
如果创建了以下模型:
class Member(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __str__(self):
return self.last_name + ", " + self.first_name
class Organisation(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=140)
def __str__(self):
return self.name
class Membership(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
member_id = models.ForeignKey('Member', on_delete=models.DO_NOTHING)
organisation_id = models.ForeignKey('Organisation', on_delete=models.DO_NOTHING)
membership_no = models.CharField(max_length=20)
class Meta:
unique_together = (("organisation_id", "member_id"),
("organisation_id", "membership_no"))
def __str__(self):
mbr = Member.objects.get(pk=self.member_id)
org = Organisation.objects.get(pk=self.organisation_id)
return str(org) + ": " + str(mbr)
当我尝试 view/edit 管理员中的会员模型时出现问题。我收到错误:
类型错误 at/admin/membership/membership
异常值:'Anderson, Roy' 不是有效的 UUID。
我使用的是 Django 版本 1.10.3。
现在字符串 'Anderson, Roy' 恰好是 Member 模型的数据库条目之一,并且似乎是由 str 编辑的值 return成员模型的功能。但是我不知道为什么它试图将它用作 UUID。我正在尝试使用 Member 和 Organization 模型中的用户字符串值来为 Membership 模型创建 return 值(str 函数)。看来那个功能有问题。
这是
mbr = Member.objects.get(pk=self.member_id)
为给定 UUID 检索成员的正确方法?
非常感谢任何帮助。谢谢
问题出在你的_ str _ Member 模型的方法中,如果你需要一个记录的全名,你应该使用方法 return 完整的 name.Because _ str _ 方法 returns 调用时任何对象的默认值和您的代码 returns 成员的全名,而不是该成员的 id。对于要 returned 的 id 或 UUID,请使用 _ unicode _ 方法代替 str。
所以更新后的代码应该是这样的:
class Member(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __unicode__(self):
return self.id
def get_full_name(self):
return self.last_name + ", " + self.first_name
然后使用这个:
mbr = Member.objects.get(pk=self.member_id)
更新 1:
如果您不想将方法从 str 更改为 Unicode,也可以使用此方法:
def __str__(self):
mbr = Member.objects.get(pk=self.member_id.id)
org = Organisation.objects.get(pk=self.organisation_id.id)
return str(org) + ": " + str(mbr)
您只需要将 .id 添加到您的代码中,因为现在,self.member_id return 是一个对象,对于 get() 方法,您只需要该对象的 ID。
试图掌握 Django(来自 php 或 .Net 过去)并发现它有点挑战。
如果创建了以下模型:
class Member(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __str__(self):
return self.last_name + ", " + self.first_name
class Organisation(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=140)
def __str__(self):
return self.name
class Membership(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
member_id = models.ForeignKey('Member', on_delete=models.DO_NOTHING)
organisation_id = models.ForeignKey('Organisation', on_delete=models.DO_NOTHING)
membership_no = models.CharField(max_length=20)
class Meta:
unique_together = (("organisation_id", "member_id"),
("organisation_id", "membership_no"))
def __str__(self):
mbr = Member.objects.get(pk=self.member_id)
org = Organisation.objects.get(pk=self.organisation_id)
return str(org) + ": " + str(mbr)
当我尝试 view/edit 管理员中的会员模型时出现问题。我收到错误: 类型错误 at/admin/membership/membership 异常值:'Anderson, Roy' 不是有效的 UUID。
我使用的是 Django 版本 1.10.3。
现在字符串 'Anderson, Roy' 恰好是 Member 模型的数据库条目之一,并且似乎是由 str 编辑的值 return成员模型的功能。但是我不知道为什么它试图将它用作 UUID。我正在尝试使用 Member 和 Organization 模型中的用户字符串值来为 Membership 模型创建 return 值(str 函数)。看来那个功能有问题。 这是
mbr = Member.objects.get(pk=self.member_id)
为给定 UUID 检索成员的正确方法?
非常感谢任何帮助。谢谢
问题出在你的_ str _ Member 模型的方法中,如果你需要一个记录的全名,你应该使用方法 return 完整的 name.Because _ str _ 方法 returns 调用时任何对象的默认值和您的代码 returns 成员的全名,而不是该成员的 id。对于要 returned 的 id 或 UUID,请使用 _ unicode _ 方法代替 str。 所以更新后的代码应该是这样的:
class Member(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __unicode__(self):
return self.id
def get_full_name(self):
return self.last_name + ", " + self.first_name
然后使用这个:
mbr = Member.objects.get(pk=self.member_id)
更新 1:
如果您不想将方法从 str 更改为 Unicode,也可以使用此方法:
def __str__(self):
mbr = Member.objects.get(pk=self.member_id.id)
org = Organisation.objects.get(pk=self.organisation_id.id)
return str(org) + ": " + str(mbr)
您只需要将 .id 添加到您的代码中,因为现在,self.member_id return 是一个对象,对于 get() 方法,您只需要该对象的 ID。