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

时间:2016-11-16 07:10:49

标签: python django models uuid

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

当我尝试在管理员中查看/编辑成员资格模型时,会出现此问题。我收到错误: / admin / membership /成员资格中的TypeError 例外值:'Anderson,Roy'不是有效的UUID。

我正在使用Django版本1.10.3。

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

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

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

任何帮助非常感谢。感谢

1 个答案:

答案 0 :(得分:2)

问题出在您的 _ str _ 成员模型方法中,如果您需要记录的全名,则应使用方法返回全名。因为_ str _方法在调用时返回任何对象的默认值,并且您的代码返回Member的全名,而不是该Member的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。