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

标签 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)

当我尝试在管理中查看/编辑成员(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/

相关文章:

javascript - 将数据从 Django View 获取到 JS 以在页面上执行的最佳实践?

python - qpython android IOError : [Erno 2] No such file or directory

mysql - 使用 MySQL 设置 Django 时日期时间值不正确

mysql - Laravel 同时删除两个相关表

collections - Backbone.js:如何访问嵌套集合的父模型?

python - 在 Python 中模拟抛硬币实验

python - 如何从utcnow中提取日、月、年?

python - Django REST 框架 : read-write Custom Relational Fields

python - 获取文件中所有用户定义的类

python - django rest 3.1.1 - 具有 "many"属性的一对多序列化器