Reputation: 63
in my first journey into the django world I am trying to have a models unicode function reference another models unicode function with foreign key references. This is what I have and it's not working
class Rider(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __unicode__(self):
return self.first_name + " " + self.last_name
class Ride(models.Model):
ride_name = models.CharField(max_length=200)
ride_meeting_place = models.CharField(max_length=2000)
ride_description = models.CharField(max_length=2000)
ride_leader = models.ForeignKey(Rider)
ride_date = models.DateTimeField('date of ride')
ride_miles = models.FloatField('scheduled miles')
def __unicode__(self):
return self.ride_name
class Miles(models.Model):
rider_id = models.ForeignKey(Rider)
ride_id = models.ForeignKey(Ride)
actual_miles = models.FloatField('actual miles')
def __unicode__(self):
return self.rider_id + " " + self.ride_id + " " + self.actual_miles
The last line is the one I'm having trouble with.
Upvotes: 2
Views: 199
Reputation: 473753
You don't need to add _id
prefix:
class Miles(models.Model):
rider = models.ForeignKey(Rider)
ride = models.ForeignKey(Ride)
actual_miles = models.FloatField('actual miles')
def __unicode__(self):
return "%s %s %s" % (self.rider, self.ride, self.actual_miles)
By using string formatting, you are actually joining str(self.rider)
, str(self.ride)
and str(self.actual_miles)
, which means calling self.rider.__unicode__()
and self.ride.__unicode()__
under the hood. Quote from docs:
If you define a
__unicode__()
method on your model and not a__str__()
method, Django will automatically provide you with a__str__()
that calls__unicode__()
and then converts the result correctly to a UTF-8 encoded string object. This is recommended development practice: define only__unicode__()
and let Django take care of the conversion to string objects when required.
Upvotes: 1
Reputation: 16786
I would tidy up your models a bit:
class Rider(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __unicode__(self):
return self.first_name + " " + self.last_name
class Ride(models.Model):
name = models.CharField(max_length=200)
meeting_place = models.CharField(max_length=2000)
description = models.CharField(max_length=2000)
leader = models.ForeignKey(Rider)
date = models.DateTimeField('date of ride')
miles = models.FloatField('scheduled miles')
def __unicode__(self):
return self.name
class Miles(models.Model):
rider = models.ForeignKey(Rider)
ride = models.ForeignKey(Ride)
actual_miles = models.FloatField('actual miles')
def __unicode__(self):
return "%s %s %s" % (self.rider, self.ride, self.actual_miles)
No need to preface all of your Ride
fields with ride_
.
Don't call your foreign key rider_id
, just use rider
(same with ride_id
)
Then force the unicode by using a string formatter.
Upvotes: 2