Django 模型 self._meta.get_all_field_names() 返回的字段不在我的模型中?
Django model self._meta.get_all_field_names() is returning a field that is not in my model?
出于某种原因,当我 运行 self._meta.get_all_field_names()
时,我得到了这个输出:
['account_created', 'email', 'first_name', u'id', 'last_active',
'last_name', 'password', 'song', 'username']
如您所见,我的 class 中没有 "song" 字段(但我有另一个名为 "song" 的模型)。这可能是一个错误还是我做错了什么?
class user(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
username = models.CharField(max_length=50)
password = models.CharField(max_length=50)
email = models.EmailField()
account_created = models.DateTimeField(null=True,blank=True)
last_active = models.DateTimeField(null=True,blank=True)
def __unicode__(self):
# return "{} {} {} {} {} {} {}".format(self.first_name,self.last_name,self.username, self.password,self.email, self.account_created,self.last_active)
return ",".join(["{}:{} ".format(i,getattr(self,i)) for i in self._meta.get_all_field_names() if i != "song"])
这是我的"song"class如果有帮助的话:
class song(models.Model):
title = models.CharField(max_length = 128)
artist = models.CharField(max_length = 30)
submitted_by = models.ForeignKey(user,null=True,blank=True)
filename = models.CharField(max_length = 256)
filesize = models.BigIntegerField()
def __unicode__(self):
return "{} by {}".format(self.title,self.artist)
你的 song
class 有一个指向 user
的外键 submitted_by
,所以有一个 reverse relationship 从 user
到song
.
在 Django 1.7 及更早版本中,您可以尝试使用 self._meta.local_fields
:
[x.name for x in self._meta.local_fields]
这将忽略多对多字段(user
模型上没有任何字段),您可以通过以下方式获得:
[x.name for x in self._meta.local_many_to_many]
在即将到来的 Django 1.8 中,Model._meta
API 已经正式化,所以像这样的内省模型应该更直接。
出于某种原因,当我 运行 self._meta.get_all_field_names()
时,我得到了这个输出:
['account_created', 'email', 'first_name', u'id', 'last_active',
'last_name', 'password', 'song', 'username']
如您所见,我的 class 中没有 "song" 字段(但我有另一个名为 "song" 的模型)。这可能是一个错误还是我做错了什么?
class user(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
username = models.CharField(max_length=50)
password = models.CharField(max_length=50)
email = models.EmailField()
account_created = models.DateTimeField(null=True,blank=True)
last_active = models.DateTimeField(null=True,blank=True)
def __unicode__(self):
# return "{} {} {} {} {} {} {}".format(self.first_name,self.last_name,self.username, self.password,self.email, self.account_created,self.last_active)
return ",".join(["{}:{} ".format(i,getattr(self,i)) for i in self._meta.get_all_field_names() if i != "song"])
这是我的"song"class如果有帮助的话:
class song(models.Model):
title = models.CharField(max_length = 128)
artist = models.CharField(max_length = 30)
submitted_by = models.ForeignKey(user,null=True,blank=True)
filename = models.CharField(max_length = 256)
filesize = models.BigIntegerField()
def __unicode__(self):
return "{} by {}".format(self.title,self.artist)
你的 song
class 有一个指向 user
的外键 submitted_by
,所以有一个 reverse relationship 从 user
到song
.
在 Django 1.7 及更早版本中,您可以尝试使用 self._meta.local_fields
:
[x.name for x in self._meta.local_fields]
这将忽略多对多字段(user
模型上没有任何字段),您可以通过以下方式获得:
[x.name for x in self._meta.local_many_to_many]
在即将到来的 Django 1.8 中,Model._meta
API 已经正式化,所以像这样的内省模型应该更直接。