试图掌握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的成员的正确方法?
任何帮助非常感谢。感谢
答案 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。