2013-09-24 1 views
2

в моем первом путешествии в мир django Я пытаюсь использовать ссылку на функцию unicode для моделей других моделей unicode с ссылками на внешние ключи. Это то, что у меня есть, и оно не работаетСсылка на поля из других моделей

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 

Последняя строка - это то, с чем я столкнулся.

+0

Когда вы говорите: «Это не работает», что конкретно вы имеете в виду? – qaphla

+0

Ошибка была 'TypeError: неподдерживаемый тип операндов для +: 'Rider' и 'str' ' Теперь решил. – dzanot

ответ

2

Я бы привести в порядок ваши модели немного:

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) 

Нет необходимости предварить всех ваших Ride полей с ride_.

Не называйте ваш внешний ключ rider_id, просто используйте rider (то же самое с ride_id)

Затем заставить Юникода с помощью строки форматирования.

+0

Спасибо, ребята! Теперь, чтобы провести некоторое исследование форматирования строк и конкатенации ... – dzanot

1

Вам не нужно добавлять префикс _id:

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) 

С помощью строки форматирования, вы на самом деле присоединения str(self.rider), str(self.ride) и str(self.actual_miles), что означает вызов self.rider.__unicode__() и self.ride.__unicode()__ под капотом. Цитата 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.

+0

Теперь исправлено это, но уточнить: Если бы я поместил каждое поле в функцию 'str()', он будет вести себя так, как предполагалось? исходной ошибкой, которую я получил, был 'TypeError: неподдерживаемый тип операндов для +: 'Rider' и 'str' ' – dzanot

+1

@dzanot yup, вы могли бы поместить его в 'str()' вместо этого. – alecxe

Смежные вопросы