gpt4 book ai didi

python - django 使用 uuid 主键访问链接模型

转载 作者:行者123 更新时间:2023-12-01 03:33:20 25 4
gpt4 key购买 nike

尝试掌握 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)

当我尝试在管理中查看/编辑成员(member)资格模型时,会出现此问题。我收到错误:/admin/membership/membership 处出现类型错误异常值:“Anderson, Roy”不是有效的 UUID。

我使用的是 Django 版本 1.10.3。

现在,字符串“Anderson, Roy”恰好是 Member 模型的数据库条目之一,并且似乎执行了 Member 模型的 str 函数返回的值。但我不知道为什么它试图将其用作 UUID。我正在尝试使用成员和组织模型中的字符串值来为成员模型创建返回值(str 函数)。看来这个功能有问题。这是吗

mbr = Member.objects.get(pk=self.member_id) 

检索给定 UUID 的成员的正确方法?

非常感谢任何帮助。谢谢

最佳答案

问题出在你的成员(member)模型的 _ str _ 方法中,如果你需要记录的全名,你应该使用一个方法来返回全名因为 _ str _ 方法在调用时返回任何对象的默认值,并且您的代码返回成员的全名,而不是该成员的 id。要返回 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 返回一个对象,对于 get() 方法,您只需要该对象的 id 即可。

关于python - django 使用 uuid 主键访问链接模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40626058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com