如何在生产服务器中替换Django应用的models.py
我有一个简单的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开发服务器上运行得很好。我希望能得到一些建议,因为在我让这个应用正常运行后,我会处理其他未解决的问题。谢谢!
编辑
感谢大家的回答。因为我想清空数据库,所以我会尝试 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']
再次感谢大家!
5 个回答
在你的项目中运行一个 manage.py sqlall 命令。
这个命令会输出创建数据库表的SQL语句。
接下来,查看输出的内容,找到你新添加的列,然后用这些信息来帮助你创建 修改表的语句。
顺便提一下,你有两个“学校”的定义,这是不是有点奇怪?
在一个正在运行的Django环境中修改模型可能会有点麻烦,这取决于你采用的方式。
如果你不介意丢失一些数据,可以使用一个简单的 manage.py
命令来解决这个问题:
python manage.py reset [app name]
但是,如果你想保留数据库中已经存在的数据,就需要手动执行一些SQL语句来修改数据库结构。这可能会变得有点复杂,如果你不小心的话,很难跟上进度。
我之前做过的办法是,为每次对模型的修改写一条SQL语句,并把它记录在某个地方,还要注明日期。我还会记录每个数据库最后一次修改结构的时间(在我的情况下,包括开发环境、测试环境和生产环境)。要把某个数据库更新到正确的结构,我只需运行所有在该数据库上次更新后日期的结构修改SQL语句。
因为你在使用sqlite数据库,而且你想清空数据,这个操作非常简单。你只需要添加你需要的两个字段,把你的数据库移到一个备份的位置,然后重新运行manage.py syncdb。这样它会为你设置一个新的数据库。如果你需要保留旧的数据,或者你使用的是更复杂的数据库,或者你想要管理数据的变化,那么你应该考虑使用一个像South这样的数据库迁移工具。