2011-10-24 35 views
6

Tôi hiện đang có một cấu trúc mà cần phải được viết lại để đối phó với Django-CMSChuyển dữ liệu từ một mẫu khác với Django Nam

Hiện nay các thiết lập như sau

class Video(models.Model):   
    #embed_code_or_url = models.CharField(max_length=2000) 
    permalink = models.URLField(verify_exists=True, unique=True, max_length=255, default="http://", validators=[validate_youtube_address]) 
    thumbnail = models.CharField(max_length=500, blank=True, null=True) 
    # Data 
    title = models.CharField(max_length=255, blank=True) 
    ... 

class VideoPlugin(CMSPlugin): 
    video = models.ForeignKey(Video) 

khi tôi bây giờ chuyển tất cả các trường của tôi từ Video sang VideoPlugin, chạy sơ đồ của tôi, tôi cũng muốn chuyển TẤT CẢ thông tin từ Video sang VideoPlugin khi tôi chạy di chuyển.

Có ai có ví dụ về cách thức này có thể đạt được không?

Đây là beginnig của di cư để chạy

class Migration(SchemaMigration): 

    def forwards(self, orm): 

     # Adding field 'VideoPlugin.permalink' 
     db.add_column('cmsplugin_videoplugin', 'permalink', self.gf('django.db.models.fields.URLField')(default='http://', unique=True, max_length=255), keep_default=False) 

     # Adding field 'VideoPlugin.thumbnail' 
     db.add_column('cmsplugin_videoplugin', 'thumbnail', self.gf('django.db.models.fields.CharField')(max_length=500, null=True, blank=True), keep_default=False) 

     # Adding field 'VideoPlugin.title' 
     db.add_column('cmsplugin_videoplugin', 'title', self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), keep_default=False) 

     ... 

sự giúp đỡ của bạn được nhiều đánh giá cao

+0

bản sao có thể có của [Làm cách nào để di chuyển mô hình ra khỏi một ứng dụng django và tạo mô hình mới?] (Http://stackoverflow.com/questions/1258130/how-do-i-migrate-a-model- out-of-one-django-app-and-into-a-new-one) – dbn

Trả lời

15

Bạn tạo một datamigration:

$ python manage.py datamigration yourapp name_of_this_migration 

này bị đóng băng các mô hình trong ứng dụng của bạn. Nếu một (các) ứng dụng khác đang tham gia vào quá trình di chuyển, bạn cũng cần phải thêm --freeze app1 --freeze app2, v.v. vào dòng đó để bao gồm cả những ứng dụng đó trong quá trình di chuyển của bạn.

Điều này thiết lập cấu trúc tệp di chuyển cơ bản cho bạn, nhưng di chuyển forwardsbackwards bị trống. Đó là vào bạn để xác định logic sẽ di chuyển dữ liệu từ một đến khác. Nhưng điều này làm việc giống như bất cứ điều gì khác trong Django, ngoại trừ bạn sử dụng ORM Nam. Đối với bất kỳ mô hình nào trong ứng dụng của bạn, trong đó di chuyển này cư trú, bạn sử dụng orm.MyModel.objects cho bất kỳ ứng dụng nào khác mà bạn đã thêm với thông số --freeze, bạn sử dụng orm['someapp.SomeModel'].objects.

Ngoài ra, bạn chỉ nhận được/lọc/tạo, v.v., các đối tượng như bình thường di chuyển dữ liệu từ một đến khác. Rõ ràng, di chuyển tiền đạo của bạn cần logic di chuyển dữ liệu mà bạn muốn nó ngay bây giờ và quá trình di chuyển ngược của bạn phải có logic cần thiết để khôi phục dữ liệu về nơi ban đầu.

Sau đó, bạn có thể di chuyển tiến và lùi trong môi trường dev để đảm bảo nó hoạt động bình thường. Một lưu ý quan trọng: đây chỉ là để di chuyển dữ liệu xung quanh. KHÔNG thay đổi hoặc xóa bất kỳ cấu trúc bảng nào trong dữ liệu của bạn. Nếu bạn cần xóa bảng sau khi dữ liệu đã được di chuyển. Tạo sơ đồ sau dữ liệu.

+0

với Django 1.11 trở lên, bạn phải sử dụng 'python manage.py makemigrations --empty yourappname' để tạo một tệp di chuyển rỗng – Laky

Các vấn đề liên quan