Django中的重复模型字段

时间:2014-07-14 11:23:16

标签: python django django-migrations

重复的模型字段给我带来了麻烦(当我运行我的网页时没有这样的表appname_modelname)。每当我执行./manage.py迁移appname时,它都会给我"重复字段"。我检查了我的models.py,其中只有一个。如何删除该重复字段?似乎无论我做什么,它都会停留。我试过了:

  • 删除数据库

  • 删除app文件夹中的迁移文件夹

  • 执行./manage.py sqlclear south,然后在dbshel​​l中删除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 个答案:

答案 0 :(得分:5)

你不能这样做,对于你的用户外键,Django ORM将创建一个名为user_id的数据库字段(你的外键字段名加上_id),将其用作FK中的一个数据库中。

您不必自己创建此字段(ORM会照顾),即使您需要,也可以更改属性useruser_id的名称。

来自the documentation

  

在幕后,Django将“_id”附加到字段名称以创建其数据库列名称。在上面的示例中,Car模型的数据库表将具有manufacturer_id列。 (您可以通过指定db_column显式更改此值)但是,您的代码永远不必处理数据库列名,除非您编写自定义SQL。您将始终处理模型对象的字段名称。

答案 1 :(得分:-1)

不确定但在这两行中引起的问题

user = models.ForeignKey(User, null=False)
user_id = models.IntegerField(User, null=True)

最好使用“相关名称”属性来避免重复错误,因为数据库“user”将被添加为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")

检查这是否可以解决您的问题