引用其他模型的字段

时间:2013-09-24 19:11:45

标签: python django django-models

在我进入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

最后一行是我遇到麻烦的。

2 个答案:

答案 0 :(得分: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相同)

然后使用字符串格式化程序强制unicode。

答案 1 :(得分: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

  

如果您在模型上定义__unicode__()方法,而不是__str__()   方法,Django会自动为你提供__str__()   调用__unicode__()然后将结果正确转换为UTF-8   编码的字符串对象这是推荐的开发实践:   仅定义__unicode__()并让Django负责转换   在需要时串起对象。