dzanot
dzanot

Reputation: 63

Referencing fields from other models

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

Answers (2)

alecxe
alecxe

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

dgel
dgel

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

Related Questions