如何在生产服务器中替换Django应用的models.py

-1 投票
5 回答
980 浏览
提问于 2025-04-15 16:55

我有一个简单的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 个回答

0

在你的项目中运行一个 manage.py sqlall 命令。

这个命令会输出创建数据库表的SQL语句。

接下来,查看输出的内容,找到你新添加的列,然后用这些信息来帮助你创建 修改表的语句

顺便提一下,你有两个“学校”的定义,这是不是有点奇怪?

0

在一个正在运行的Django环境中修改模型可能会有点麻烦,这取决于你采用的方式。

如果你不介意丢失一些数据,可以使用一个简单的 manage.py 命令来解决这个问题:

python manage.py reset [app name]

但是,如果你想保留数据库中已经存在的数据,就需要手动执行一些SQL语句来修改数据库结构。这可能会变得有点复杂,如果你不小心的话,很难跟上进度。

我之前做过的办法是,为每次对模型的修改写一条SQL语句,并把它记录在某个地方,还要注明日期。我还会记录每个数据库最后一次修改结构的时间(在我的情况下,包括开发环境、测试环境和生产环境)。要把某个数据库更新到正确的结构,我只需运行所有在该数据库上次更新后日期的结构修改SQL语句。

0

因为你在使用sqlite数据库,而且你想清空数据,这个操作非常简单。你只需要添加你需要的两个字段,把你的数据库移到一个备份的位置,然后重新运行manage.py syncdb。这样它会为你设置一个新的数据库。如果你需要保留旧的数据,或者你使用的是更复杂的数据库,或者你想要管理数据的变化,那么你应该考虑使用一个像South这样的数据库迁移工具。

撰写回答