当我在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 )
答案 0 :(得分:6)
您使用错误的命名约定让自己感到困惑。
在团队中,mentor_id
和mentee_id
不是 ID。它们是实际的Mentor
和Mentee
对象。因此,在__str__
方法中,您尝试使用mentee_id
的值查询Mentee类,实际上是将现有的Mentee对象传递给查询。没有必要这样做。
您的字段应该被称为mentor
和mentee
,您应该直接在您的方法中使用它们:
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_id
,mentee_id
不是Team
类中的整数。它们分别为Mentor
和Mentee
类型。改为使用:
self.mentor_id.name
和
self.mentee_id.name
__str__
中的。
当然,将这些字段重命名为mentor
类中的mentee
和Team
会更好。
答案 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
个对象与其对应的Mentor
和Mentee
对象有直接链接。
您不应该关心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)