2009-12-11 7 views
-1

admin 만 사용하는 간단한 django 앱이 있습니다. 이것은 서버에 지금처럼 모델입니다 :프로덕션 서버의 Django 앱에서 models.py를 바꾸는 방법

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을 사용하고 있습니다.

새로운 앱을 배포하려했지만 유감스럽게도 호스팅 공동체는 도움을 거부합니다. 2 개의 앱이 필요 없기 때문에 대체 할 생각은 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'] 

감사합니다!

+2

주 학교 ForeignKey. CharField "school_name"등을 호출하는 것과 같이 다른 이름을 지정해야합니다. – jcdyer

+0

jcd : 감사합니다. 나는이 일을 한 후에 학교 이름을 바꿀 것입니다. 검색은 내가 원하는 시점에서 작동하기 때문에 어떻게 작동하는지 이해할 수 없습니다. 결국 키워드 검색을 추가하고 싶습니다. – Zeynel

+0

나는이 질문이 왜 왜곡 된 것인지 궁금해하고 있었다. 몇 가지 좋은 해답을 얻었고 문제를 해결할 수 있었고 많은 것을 배웠습니다. 답변을 얻은 모든 분들께 다시 한번 감사드립니다. – Zeynel

답변

0

sqlite 데이터베이스를 사용하고 있으며 데이터를 지우고 싶으므로 쉽지 않습니다. 두 필드를 추가하고 데이터베이스를 백업 위치로 이동 한 다음 manage.py syncdb를 다시 실행하십시오. 새 데이터베이스가 설정됩니다. 이전 데이터를 유지해야하거나 더 복잡한 데이터베이스를 사용하거나 시간이 경과함에 따라 변경 사항을 관리하려는 경우 South과 같은 스키마 마이그레이션 도구를 살펴 봐야합니다.

+0

jcd : manage.py syncdb를 실행하여 새 db를 설정하는 것으로 충분합니까? 이 스레드에 따르면 http://groups.google.com/group/django-users/browse_frm/thread/c96f717b1fc1dbf4 syncdb가 새 테이블을 만들지 않습니까? – Zeynel

+0

Syncdb는 새 테이블을 만들지 만 기존 테이블에 새 필드를 만들지 않습니다. – jcdyer

+0

혼란 스럽습니다. 새 models.py를 업로드하고 syncdb를 실행하고 서버를 재설정하면 TemplateSyntaxError가 표시됩니다. 해당 열은 없습니다. wkw1_lawyer.firm_url 그래서 데이터베이스가 재설정되지 않았습니다. 새로운 프로젝트를 시작해야 할 것 같습니다. – Zeynel

0

아니요, 아니요, 당신은 models.py를 바꿀 수 없습니다. 일종의 스키마 마이그레이션이 필요합니다. django south와 같은 도구를 사용하지 않으면 수동으로해야합니다.

찾아보기 http://www.sqlite.org/lang_altertable.html manage.py sqlall을 사용하면 필요한 SQL 문을 볼 수 있습니다.

0

실행이 새 열에 대한 덤프를 보면, 명령을 거기에서

를 만들 SQL 덤프하고 Alter Table statements

사이드를 만드는 데 도움이 사용됩니다

프로젝트에 manage.py sqlall 당신이 2 개의 "학교"정의를 가지고 있다는 것은 좀 이상합니다.

0

라이브 Django 환경에서 모델을 수정하는 것은 접근 방식에 따라 다소 번거로운 작업이 될 수 있습니다.

데이터를 잃는 괜찮다면, 간단한 manage.py 명령은 트릭을 할 것입니다 : 그러나, 당신이 데이터베이스에 이미 데이터를 유지하려면

python manage.py reset [app name] 

것은, 당신이해야합니다를 일부 SQL을 수동으로 실행하여 스키마를 수정하십시오. 조심하지 않으면 추적하기가 더러워집니다.

이전에 수행 한 작업은 모든 모델 변경 시마다 SQL 문을 작성하여 날짜와 함께 어딘가에 기록하는 것입니다. 또한 모든 데이터베이스 (내 경우, 개발, 준비 및 프로덕션)에서 스키마가 수정 된 마지막 시간을 기록합니다. 특정 데이터베이스를 올바른 스키마로 업데이트하려면 특정 데이터베이스가 마지막으로 업데이트 된 후 날짜의 모든 스키마 변경 SQL을 실행했습니다.

+0

이것에 따르면 : http://osdir.com/ml/python.django.user/2006-01/msg00027.html "모델을 변경하면 (일부 테이블을 삭제하고 을 추가하십시오) sqlreset이 작동하지 않습니다." 어쩌면이게 어떻게 작동하는지 오해하고있는 것일까 요? – Zeynel

+0

이것은 데이터베이스의 테이블을 수동으로 삭제하거나 추가 한 경우에만 적용됩니다.당신이 그렇게하지 않은 한 (그리고 나는 왜 누군가가 될지 전혀 알지 못한다.)'manage.py reset'을 잘 사용할 수있다. – ShZ

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);') 학교가 CharField이 덮어지고 있음을

관련 문제