强制转换为 Unicode:需要字符串或缓冲区,已找到 UserProfile

coercing to Unicode: need string or buffer, UserProfile found

当我尝试在 Django 1.7 的管理面板中查看文件共享时出现此错误

coercing to Unicode: need string or buffer, UserProfile found

我的models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User,primary_key=True)
    def __unicode__(self):
        return self.user.username
    User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

class FileDetails(models.Model):
    fileId = models.CharField(max_length = 100,primary_key=True,db_index=True)        
    def __unicode__(self):
        return self.fileId

class Permission(models.Model):
    user = models.ForeignKey(UserProfile)
    def __unicode__(self):
        return self.user

class FileShare(models.Model):
    owner = models.ForeignKey(UserProfile)
    file_requested=models.ForeignKey(FileDetails)
    permission=models.ManyToManyField(Permission)
    def __unicode__(self):
        return str(self.owner)

为什么会出现这个错误?我该如何更正它?

当你为Permission定义__unicode__方法时,它应该是return str(self.user)而不是return self.user

您的 Permission 对象 returns 转换为 Unicode 时的 UserProfile 对象:

class Permission(models.Model):
    user = models.ForeignKey(UserProfile)
    def __unicode__(self):
        return self.user

__unicode__ method must return a unicode object, always, instead. You could use the unicode() typeself.user提供这样的值:

class Permission(models.Model):
    user = models.ForeignKey(UserProfile)
    def __unicode__(self):
        return unucode(self.user)

您可能想在您的 FileShare 模型中做同样的事情:

class FileShare(models.Model):
    owner = models.ForeignKey(UserProfile)
    file_requested=models.ForeignKey(FileDetails)
    permission=models.ManyToManyField(Permission)
    def __unicode__(self):
        return unicode(self.owner)

你在那里使用 str(),这将导致一个包含 UTF-8 字节 的字符串,然后必须再次(隐式)解码.但是 Python 将尝试为此使用 ASCII 编解码器,如果所有者用户名包含 ASCII 字符以外的任何字符,解码将失败。