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。