Django:models.py中的类型不匹配错误

时间:2015-07-25 19:04:17

标签: python django

当我在python3 manage.py shell

中执行这些行时
In [1]: from dream_site.models import Mentor, Mentee, Team
In [2]: a = Mentee.objects.get( pk = 1 ).name
In [3]: b = Mentor.objects.get(pk=1).name
In [4]: print( a + b )

它会按预期打印正确的输出,但是在models.py我有以下代码时它会给我int() argument must be a string or a number错误:

def __str__(self):     # Belonging to Team object
    return ( str( self.pk ) + " - " +  Mentor.objects.get( pk = self.mentor_id ).name   + " - " +  Mentee.objects.get( pk = self.mentee_id ).name   )

这是发生错误的地方。即使它在shell中将它们显示为str类型。
models.py的其他部分:

class Mentor(models.Model):
    mentor_id =     models.AutoField( primary_key = True )
    name =          models.CharField( default = '', max_length = 254 )

class Mentee(models.Model):
    mentee_id =     models.AutoField( primary_key = True )
    name =          models.CharField( default = '', max_length = 254 )

class Team(models.Model):
    team_id =                       models.AutoField( primary_key = True )
    mentor_id =                     models.ForeignKey( Mentor )
    mentee_id =                     models.ForeignKey( Mentee )
    team_since =                    models.DateTimeField( default = django.utils.timezone.now, blank = True )

4 个答案:

答案 0 :(得分:6)

您使用错误的命名约定让自己感到困惑。

在团队中,mentor_idmentee_id 不是 ID。它们是实际的MentorMentee对象。因此,在__str__方法中,您尝试使用mentee_id的值查询Mentee类,实际上是将现有的Mentee对象传递给查询。没有必要这样做。

您的字段应该被称为mentormentee,您应该直接在您的方法中使用它们:

return str(self.pk) + " - " +  self.mentor.name   + " - " +  self.mentee.name

甚至更好,使用字符串插值:

return "%s - %s - %s" %  (self.pk, self.mentor.name, self.mentee.name)  

答案 1 :(得分:2)

mentor_idmentee_id不是Team类中的整数。它们分别为MentorMentee类型。改为使用:

 self.mentor_id.name

 self.mentee_id.name
__str__中的

当然,将这些字段重命名为mentor类中的menteeTeam会更好。

答案 2 :(得分:1)

这是一个外键,你可以直接访问它的表元素。另外,使用format,代表您进行类型转换。

def __str__(self):     # Belonging to Team object
    return "{0} - {1} - {2}".format(self.pk, self.mentor_id.name, self.mentee_id.name)

有关格式化的详细信息,请查看PyFormat

答案 3 :(得分:1)

您应该将它们作为对象引用...

class Team(models.Model):
    team_id =                       models.AutoField( primary_key = True )
    mentor_id =                     models.ForeignKey( Mentor )
    mentee_id =                     models.ForeignKey( Mentee )
    team_since =                    models.DateTimeField( default = django.utils.timezone.now, blank = True )

    def __str__(self):
        return '{0} - {1} - {2}'.format(self.team_id, self.mentor_id.name, self.mentee_id.name)

Django为您提供了一个ORM包装器,这意味着您可以构建类,尤其是类之间的连接,而无需关心数据库存储或实现。 您可以轻松地假设,Team个对象与其对应的MentorMentee对象有直接链接。 您不应该关心Django代码中的数据库ID。

所以,更好(更清楚)就是这样:

class Team(models.Model):
    team_id = models.AutoField( primary_key = True )
    mentor = models.ForeignKey( Mentor )
    mentee = models.ForeignKey( Mentee )
    team_since = models.DateTimeField(default=django.utils.timezone.now, blank=True )

    def __str__(self):
        return '{0} - {1} - {2}'.format(self.team_id, self.mentor.name, self.mentee.name)