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 relationshipusersong.

在 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 已经正式化,所以像这样的内省模型应该更直接。