2012-11-28 15 views
6

Tôi đang cố gắng di chuyển một vài mô hình từ ứng dụng Django này sang ứng dụng khác và dựa trên câu hỏi này How do I migrate a model out of one django app and into a new one? Tôi đã làm việc này khá nhiều nhưng khi tạo di chuyển đầu tiên tôi nhận được lỗi này:contenttypes.contenttype không có sẵn trong di chuyển này

"The model 'contenttype' from the app 'contenttypes' is not available in this migration." 

Google và SO dường như không tìm thấy bất kỳ trường hợp cho điều này xảy ra và câu hỏi nêu trên không có bất cứ điều gì cụ thể để nói về nó cả, trừ những nhận xét trong các mã:

if not db.dry_run: 
    # For permissions to work properly after migrating 
    orm['contenttypes.contenttype'].objects.filter(app_label='common', model='cat').update(app_label='specific') 

Sẽ thực sự đánh giá cao ăn sâu vào những gì tôi đang làm sai.

Dưới đây là các tập tin hai di cư:

Tạo:

# encoding: utf-8 
import datetime 
from south.db import db 
from south.v2 import SchemaMigration 
from django.db import models 

class Migration(SchemaMigration): 

    def forwards(self, orm): 
     db.rename_table('cars_country', 'general_country') 
     if not db.dry_run: 
      # For permissions to work properly after migrating 
      orm['contenttypes.ContentType'].objects.filter(app_label='cars', model='country').update(app_label='general') 

    def backwards(self, orm): 
     pass 

Xóa:

# encoding: utf-8 
import datetime 
from south.db import db 
from south.v2 import SchemaMigration 
from django.db import models 

class Migration(SchemaMigration): 

    depends_on = (
     ('general', '0002_create_country'), 
    ) 

    def forwards(self, orm): 

     db.alter_column('cars_club', 'country_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['general.Country'], null=True)) 


    def backwards(self, orm): 

     db.rename_table('general_country', 'cars_country') 
     db.alter_column('cars_club', 'country_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['cars.Country'], null=True)) 
+0

Theo tài liệu ở phía Nam: _Lưu ý rằng bạn chỉ có thể truy cập các mô hình đã bị đóng băng; Phía Nam tự động bao gồm mọi thứ có thể đạt được thông qua các khóa ngoại hoặc các mối quan hệ nhiều-nhiều, nhưng nếu bạn muốn thêm các mô hình khác, chỉ cần chuyển --tên ứng dụng sang lệnh ./manage.py datamigration._ – dgel

+0

Vì vậy, âm thanh giống như bạn cần phải có ứng dụng ContentTypes được truyền đến - vô hiệu hóa tại một số thời điểm. Không hoàn toàn hiểu làm thế nào, nhưng có thể là một gợi ý đi đúng hướng. – dgel

+0

Giả sử rằng ứng dụng ContentTypes sẽ không được nhắm mục tiêu của bất kỳ sơ đồ nào, việc nhập các mô hình từ dự án Django là xấu đến mức nào? _from nhập django.contrib.contenttypes.models ContentType_ _ContentType.objects.filter (app_label = 'common', model = 'cat') cập nhật (app_label = 'specific') _ – JCJS

Trả lời

4

Ok, tìm thấy giải pháp. Thông báo đóng băng từ dgel giúp tôi kiểm tra tài liệu ở phía Nam và có thông báo về việc di chuyển ORM: Điều này được thực hiện bằng cách nối tiếp các mô hình vào một từ điển lớn được gọi là các mô hình ở cuối mỗi lần di chuyển. Thật dễ dàng để xem; đó là đoạn mã dày đặc ở phía dưới.

Vì vậy, về cơ bản tôi chỉ cần di chuyển orm ['contenttypes.contenttype] sang tệp di chuyển thứ hai, vì từ điển mô hình kiểu nội dung đã có sẵn. Và bây giờ mọi thứ dường như hoạt động như mong muốn.

+2

Hoặc đơn giản là tạo datamigration của bạn là: ' ./manage.py datamigration app_name --auto - giải phóng contenttypes' – geoom