我有一个只使用管理员的简单django应用程序。这是现在服务器中的模型:
from django.db import models
class School(models.Model):
school = models.CharField(max_length=200)
def __unicode__(self):
return self.school
class Lawyer(models.Model):
first = models.CharField(max_length=20)
initial = models.CharField(blank=True, max_length=2)
last = models.CharField(max_length=20)
year_graduated = models.IntegerField('Year graduated')
school = models.CharField(max_length=200)
school = models.ForeignKey(School)
class Meta:
ordering = ('last',)
def __unicode__(self):
return self.first
我想添加两个新字段,以便新models.py
看起来像这样:
from django.db import models
class School(models.Model):
school = models.CharField(max_length=300)
def __unicode__(self):
return self.school
class Lawyer(models.Model):
firm_url = models.URLField('Bio', max_length=200)
firm_name = models.CharField('Firm', max_length=100)
first = models.CharField('First Name', max_length=50)
last = models.CharField('Last Name', max_length=50)
year_graduated = models.IntegerField('Year graduated')
school = models.CharField(max_length=300)
school = models.ForeignKey(School)
class Meta:
ordering = ('?',)
def __unicode__(self):
return self.first
否则其他一切都是一样的。我可以将这个新的models.py
上传到服务器并期望应用程序像以前一样工作吗?我还需要清除数据库中的内容。我正在使用sqlite3
。
我尝试部署一个新的应用程序但不幸的是托管公司拒绝提供帮助。由于我不需要两个应用程序,因此我考虑更换models.py
。这个新应用程序按预期在django dev服务器中运行。我很感激建议,因为我会在运行此应用程序后处理其他未解决的问题。谢谢!
修改
感谢所有答案。由于我希望数据库清晰,我将尝试jcd
的解决方案。因此,我将替换models.py
first = models.CharField(max_length=20)
initial = models.CharField(blank=True, max_length=2)
last = models.CharField(max_length=20)
year_graduated = models.IntegerField('Year graduated')
school = models.CharField(max_length=200)
school = models.ForeignKey(School)
使用新字段:
firm_url = models.URLField('Bio', max_length=200)
firm_name = models.CharField('Firm', max_length=100)
first = models.CharField('First Name', max_length=50)
last = models.CharField('Last Name', max_length=50)
year_graduated = models.IntegerField('Year graduated')
school = models.CharField(max_length=300)
school = models.ForeignKey(School)
拥有
from django.db import models
class School(models.Model):
school = models.CharField(max_length=200)
def __unicode__(self):
return self.school
class Lawyer(models.Model):
firm_url = models.URLField('Bio', max_length=200)
firm_name = models.CharField('Firm', max_length=100)
first = models.CharField('First Name', max_length=50)
last = models.CharField('Last Name', max_length=50)
year_graduated = models.IntegerField('Year graduated')
school = models.CharField(max_length=300)
school = models.ForeignKey(School)
class Meta:
ordering = ('last',)
def __unicode__(self):
return self.first
并将其上传到服务器。然后我将运行manage.py syncdb
。
当我打开页面时,除了新字段外,我会看到之前的admin
。
我认为稍后更新admin.py
以添加新字段没有问题:
class LawyerAdmin(admin.ModelAdmin):
fieldsets = [
('Name', {'fields': ['first', 'last', 'firm_name', 'firm_url']}),
('School', {'fields': ['school', 'year_graduated']}),
]
list_display = ('first', 'last', 'school', 'year_graduated', 'firm_name', 'firm_url')
list_filter = ['year_graduated']
#search_fields = ['last', 'first']
search_fields = ['school__school']
search_fields = ['school__lawyer__last']
再次感谢!
答案 0 :(得分:0)
不,你不能只替换models.py。 您需要某种模式迁移。 如果你不使用像django south这样的工具,你必须手动完成。
看看http://www.sqlite.org/lang_altertable.html 您可以使用manage.py sqlall查看所需的SQL语句。
答案 1 :(得分:0)
由于你使用的是sqlite数据库,并且你想要清除数据,这很容易。添加两个字段,将数据库移动到备份位置,然后重新运行manage.py syncdb。它将为您设置新数据库。如果您需要保留旧数据,使用更复杂的数据库,或者希望随时更改管理更改,则应查看类似South的架构迁移工具。
答案 2 :(得分:0)
在您的项目上运行manage.py sqlall
这将转储SQL create命令
从那里,查看新列的转储,并使用它来帮助创建Alter Table statements
旁注,你有两个“学校”定义有点奇怪吗?
答案 3 :(得分:0)
根据您的方法,在实时Django环境中修改模型可能会有点麻烦。
如果您不介意丢失数据,可以使用简单的manage.py
命令:
python manage.py reset [app name]
但是,如果要保留数据库中已有的数据,则必须手动执行一些SQL来修改模式。如果你不小心,这可能会变得混乱。
我之前所做的是为任何模型的每次更改编写一个SQL语句,并将其记录在某个地方以及日期。我还记录了上次修改任何数据库(在我的情况下,开发,登台和生产)的模式。要将任何一个数据库更新为正确的模式,我只是在上次更新该特定数据库之后的日期运行了所有模式更改SQL。
答案 4 :(得分:0)
您可以使用python manage.py sqlall <appname> | grep <column name>
来获取特定列的SQL定义。
然后,您可以执行以下操作:ALTER TABLE my_table ADD COLUMN 'column_name' varchar(30);
(在这种情况下,上面的manage.py行返回'column_name
varchar(30);')