Django模型self._meta.get_all_field_names()返回一个不在我模型中的字段?

时间:2015-02-19 14:47:35

标签: python django debugging

出于某种原因,当我运行self._meta.get_all_field_names()时,我得到了这个输出:

['account_created', 'email', 'first_name', u'id', 'last_active',
 'last_name', 'password', 'song', 'username']

正如你所看到的,没有"歌曲"我班上的字段(但我有另一个名为&#34的模型;歌曲")。这可能是一个错误,还是我做错了什么?

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"])

这是我的歌曲"如果有任何帮助,请上课:

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)

1 个答案:

答案 0 :(得分:4)

您的song班级的外键submitted_by指向user,因此从usersong有一个reverse relationship

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