Django中模型字段重复

0 投票
2 回答
2607 浏览
提问于 2025-04-18 13:13

我在使用一个重复的模型字段时遇到了麻烦(当我运行我的网页时,出现“没有这样的表 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 个回答

-1

不太确定,但问题可能出在这两行代码上。

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

检查一下这样是否能解决你的问题。

5

你不能这样做,因为在Django的数据库管理中,外键(也就是指向其他表的字段)会自动生成一个名为 user_id 的数据库字段(就是你的外键字段名加上 _id)。这个字段会被用作数据库中的外键。

你不需要自己去创建这个字段(ORM会自动处理),即使你需要它,也只需要改变属性的名字,比如 useruser_id

根据 文档 的说明:

在后台,Django会在字段名后面加上“_id”来生成数据库列的名字。在上面的例子中,Car模型对应的数据库表会有一个 manufacturer_id 列。(你可以通过指定 db_column 来显式更改这个名字)不过,除非你写自定义的SQL代码,否则你的代码不需要直接处理数据库列的名字。你只需要关注模型对象的字段名。

撰写回答