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

时间:2009-12-11 17:33:14

标签: python django sqlite

我有一个只使用管理员的简单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']

再次感谢!

5 个答案:

答案 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);')