我想更改模型中特定字段的名称:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
Run Code Online (Sandbox Code Playgroud)
应改为:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Run Code Online (Sandbox Code Playgroud)
使用南方最简单的方法是什么?
我打算在现有的Django项目中重命名几个模型,其中有许多其他模型与我想要重命名的模型有外键关系.我很确定这需要多次迁移,但我不确定具体的程序.
假设我开始在Django应用程序中使用以下模型myapp:
class Foo(models.Model):
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Foo)
is_ridonkulous = models.BooleanField()
Run Code Online (Sandbox Code Playgroud)
我想重命名Foo模型,因为名称并没有真正意义,并且导致代码混乱,并且Bar会使名称更加清晰.
从我在Django开发文档中读到的内容,我假设以下迁移策略:
修改models.py:
class Bar(models.Model): # <-- changed model name
name = models.CharField(unique=True, max_length=32)
description = models.TextField(null=True, blank=True)
class AnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, but not field name
is_awesome = models.BooleanField()
class YetAnotherModel(models.Model):
foo = models.ForeignKey(Bar) # <-- changed relation, …Run Code Online (Sandbox Code Playgroud) 我已经通过重命名其文件夹,导入及其所有引用(模板/索引)来更改Django中应用程序的名称.但是现在我尝试运行时遇到了这个错误python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
Run Code Online (Sandbox Code Playgroud)
如何调试并解决此错误?有线索吗?
看起来这应该是"容易"或至少在某处记录,我只是无法找到它.
让我们说我有一个模型:
class A(models.Model):
users = models.ManyToMany('auth.User', blank=True)
Run Code Online (Sandbox Code Playgroud)
现在我想迁移到一个through表来向ManyToMany关系添加字段...
class AUsers(models.Model):
user = models.ForeignKey('auth.User')
a = models.ForeignKey('A')
new_field = models.BooleanField()
class A(models.Model):
users = models.ManyToMany('auth.User', blank=True, through='AUsers')
Run Code Online (Sandbox Code Playgroud)
然后我做:
% ./manage.py schemamigration app --auto
Run Code Online (Sandbox Code Playgroud)
并不奇怪,它告诉我它将通过表删除原始的自动创建并为其创建一个新的AUsers.目前最好的做法是什么?是否有适当的方式迁移到新through表?我db_table在Meta 使用吗?我是不是through=...马上使用...然后做一个schemamigration --auto,然后a datamigration复制当前表(不知何故,不确定...)然后添加through关系,让它杀死表?
这里的诀窍是什么?这真的很难吗?
我使用django-south在django项目中迁移数据库表.我正在重命名模型,正如前一个问题中所讨论的那样:
# Renaming model from 'Foo' to 'Bar'
db.rename_table('myapp_foo', 'myapp_bar')
db.send_create_signal('myapp', ['Bar'])
Run Code Online (Sandbox Code Playgroud)
但是,我使用fabric自动将我的应用程序部署到生产服务器,我希望迁移在没有任何用户输入的情况下运行.为此,我使用noinput选项运行migration命令,如下所示
python manage.py migrate --noinput
Run Code Online (Sandbox Code Playgroud)
这种方法很好,除了send_create_signal在这种模式下不删除过时的内容类型.
这是因为django contenttype管理命令update_contenttypes仅在给定输入时才删除陈旧的contenttypes.
我可以直接在南迁移中复制update_contenttypes命令,但这似乎不是一个好的解决方案.有没有人建议如何触发删除内容类型而不重复django命令中的内容?
我创建了一个Django应用程序.现在我想在模型中更改我的db字段中的1个字段类型.由于数据库中已存在一些具有当前类型的记录,我想通过在models.py中更改它就无法更改类型.通过谷歌搜索我发现它可以通过改变它通过SQL控制台而不删除表来更改它.但作为一个Django新手,我无法做到这一点.有人可以帮我这样做吗?这是我的models.py
class EmployeeDetails(models.Model):
userName = models.CharField(max_length=200)
designation = models.CharField(max_length=200)
employeeID = models.IntegerField()
contactNumber = models.CharField(max_length=200)
project = models.CharField(max_length=200)
dateOfJoin=models.TextField()
Run Code Online (Sandbox Code Playgroud)
现在我想更改dateOfJoin = models.DateField().如何在不使用sql控制台命令删除表的情况下将TextFieild更改为DateField?