Trying to come to grips with Django (from php or .Net past) and finding it a little challenging.
If have created the following models:
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)
The problem occurs when I try to view/edit the Membership models in Admin. I get the error: TypeError at/admin/membership/membership Exception Value: 'Anderson, Roy' is not a valid UUID.
I am using Django version 1.10.3.
Now the string 'Anderson, Roy' happens to be one of the database entries for the Member model and appears to do the value returned by the str function for the Member model. However I don't know why it is trying to use it as a UUID. I am trying to user string values from the Member and Organisation models to create the return value (str function) for the Membership model. It seems there is a problem in that function. Is this
mbr = Member.objects.get(pk=self.member_id)
the correct way to retrieve the Member for a given UUID?
Any help greatly appreciated. Thanks
The problem is in your _ str _ method of Member model,if you need the full name of a record,you should use a method to return the full name.Because _ str _ method returns the default value of any object when called and your code returns full name of Member,instead of the id of that Member. For id or UUID to be returned,use _ unicode _ method in place of str. So the updated code should be like this :
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
And then use this :
mbr = Member.objects.get(pk=self.member_id)
UPDATE 1 :
You can also use this method if you don't want to change your method from str to 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)
You just need to add .id into your code because right now,self.member_id returns an object,for get() method,you just need the id of that object.