Django中模型字段重复
我在使用一个重复的模型字段时遇到了麻烦(当我运行我的网页时,出现“没有这样的表 appname_modelname”)。每次我执行 ./manage.py migrate appname 时,它都会提示“重复字段”。我检查了我的 models.py,里面确实只有一个字段。请问我该如何删除这个重复的字段?似乎无论我做什么,它都不会消失。我尝试过:
删除数据库
删除应用文件夹中的迁移文件夹
执行 ./manage.py sqlclear south,然后在数据库命令行中删除 south_migrationhistory 表
执行 ./manage.py schemamigration appname --initial 和 ./manage.py migrate appname --fake
我已经没有其他想法了。
class Document(models.Model):
filename = models.CharField(max_length=255, blank=True, null=True, default=None)
identity = models.CharField(max_length=255, default=None, null=True)
user = models.ForeignKey(User, null=False)
user_id = models.IntegerField(User, null=True)
docfile = models.FileField(upload_to=_upload_path, storage=fs) # upload_to is a path inside the storage path
def get_upload_path(self,filename):
return str(self.user.id) + '/' + str(date.today()) + '/' + filename
2 个回答
不太确定,但问题可能出在这两行代码上。
user = models.ForeignKey(User, null=False)
user_id = models.IntegerField(User, null=True)
最好使用“相关名称”这个属性,这样可以避免重复错误,因为在数据库中会把“用户”添加为 user_id。
user = models.ForeignKey(User, related_name="id_user") # Change the related field as your convenience
user_id = models.IntegerField(null=True, related_name="user_id")
检查一下这样是否能解决你的问题。
你不能这样做,因为在Django的数据库管理中,外键(也就是指向其他表的字段)会自动生成一个名为 user_id
的数据库字段(就是你的外键字段名加上 _id
)。这个字段会被用作数据库中的外键。
你不需要自己去创建这个字段(ORM会自动处理),即使你需要它,也只需要改变属性的名字,比如 user
或 user_id
。
根据 文档 的说明:
在后台,Django会在字段名后面加上“_id”来生成数据库列的名字。在上面的例子中,Car模型对应的数据库表会有一个
manufacturer_id
列。(你可以通过指定db_column
来显式更改这个名字)不过,除非你写自定义的SQL代码,否则你的代码不需要直接处理数据库列的名字。你只需要关注模型对象的字段名。