是否有可能从另一个模型中获取模型的unicode?

时间:2014-08-30 18:09:10

标签: python django unicode models

我有两个表,HousingPhoto(一对多关系)。 外壳表根据类型和事务字段返回unicode。我希望Photo unicode成为Housing的unicode +它自己的主键。这可能吗?

class Housing(models.Model):
    type = models.CharField(max_length=16)
    transaction = models.CharField(max_length=16)


    def __unicode__(self):
        if self.type.lower() == "house" and self.transaction.lower() == "sell":
            return "HS" + str(self.pk+100)
        elif self.type.lower() == "house" and self.transaction.lower() == "rent":
            return "HR" + str(self.pk+100)
        elif self.type.lower() == "apt" and self.transaction.lower() == "sell":
            return "AS" + str(self.pk+100)
        elif self.type.lower() == "apt" and self.transaction.lower() == "rent":
            return "AR" + str(self.pk+100)
        else:
            return "ERROR" + str(self.pk+100)

class Photos(models.Model):
    housing= models.ForeignKey(Housing)
    photo_url = models.ImageField(upload_to="photos/", blank=True, null=True)

    def __unicode__(self):
        return "Img " + str(self.pk)

1 个答案:

答案 0 :(得分:0)

您可以简单地引用相关的self.housing对象属性,或将其转换为Unicode:

def __unicode__(self):
    return u"Img({!r}, {})".format(self.pk, self.housing)

这会将self.housing.__unicode__()的输出放入主键后生成的Unicode字符串中。这是有效的,因为使用unicode自动插入unicode.format()字符串对象将使用unicode(self.housing)

您的Housing.__unicode__()方法可以稍微简化一下:

def __unicode__(self):
    if (self.type.lower() not in ('house', 'apt') or
           self.transaction.lower() not in ('sell', 'rent'):
        return 'ERROR{}'.format(self.pk + 100)
    type_, transaction = self.type[0].upper(), self.transaction[0].upper()
    return '{}{}{}'.format(type_, transaction, self.pk + 100)

请注意,这会触发self.housing关系的单独查询;如果要显示大量Photos个实例,则每个Photos实例显示一个额外的数据库查询最终会导致应用程序运行速度变慢。