Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Không thể di chuyển bằng ModelState và ProjectState bằng API di chuyển trong Django 3.0.3

Để bắt đầu, bạn cần sử dụng siêu kính mô hình , I E. ModelBase chứ không phải loại :

from django.db.models.base import ModelBase

model_definition = ModelBase(
    model_item.table_name,
    bases,
    model_config
)

Sau khi bạn sử dụng metaclass thích hợp , bạn có thể sẽ nhận được vô số lỗi, vì bạn đang sử dụng nhiều thuộc tính lớp ModelBase thiết lập nội bộ và không mong đợi bạn tự thiết lập.

Thay vì kết xuất tất cả các thuộc tính mà mô hình của bạn có, bạn chỉ nên đặt các thuộc tính ModelBase dự kiến ​​sẽ được đặt trên một mô hình truyền thống, bao gồm:

  • __module__ __qualname__
  • trường mô hình
  • bộ quản lý hoặc bộ truy vấn tùy chỉnh
  • phương pháp mô hình
  • mô hình Meta

Mọi thứ khác nên được bỏ qua.

Vì vậy, ví dụ:nếu bạn có một mô hình giống như thế này, trong mô-đun myapp.models :

class Parent(models.Model):
    name = models.CharField(max_length=45)

class Child(models.Model):
    name = models.CharField(max_length=45)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)

class ModelWithMeta(models.Model):
    class Meta:
        db_table = 'some_table'

Phiên bản động của các mô hình này cần có dạng như sau:

from django.db import models
from django.db.models.base import ModelBase

bases = (models.Model,)

Parent = ModelBase('Parent', bases, {
    '__module__': 'myapp.models',
    '__qualname__': 'Parent',
    'name': models.CharField(max_length=45),
})

Child = ModelBase('Child', bases, {
    '__module__': 'myapp.models',
    '__qualname__': 'Child',
    'name': models.CharField(max_length=45),
    'parent': models.ForeignKey('myapp.Parent', on_delete=models.CASCADE),
})

ModelWithMeta = ModelBase('ModelWithMeta', bases, {
    '__module__': 'myapp.models',
    '__qualname__': 'ModelWithMeta',
    'Meta': type('Meta', (), {'db_table': 'some_table'}),
})

Tôi không hiểu mục đích của mã di chuyển của bạn, vì vậy tôi sẽ cho rằng đó là một cuộc tấn công nhằm cố gắng làm cho các mô hình động hoạt động, có nghĩa là bạn có thể ném nó ra ngoài hoàn toàn và sử dụng trình tải di chuyển nội trang, tức là:

python3 manage.py makemigrations myapp && python3 manage.py migrate myapp

Tôi, bạn không quen thuộc với python metaclasses , Tôi khuyên bạn nên đọc chúng, vì đó là điều kiện tiên quyết để hiểu mã của tôi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao tôi không thể chèn vào MySQL?

  2. Ngắt trang trong Html2Pdf

  3. gọi một tập lệnh php cho mọi hàng trong cơ sở dữ liệu mysql của tôi

  4. Chiến lược nhóm kết nối:Tốt, Xấu hay Xấu?

  5. Bảng xếp hạng mySQL nhanh với xếp hạng người chơi (&những người chơi xung quanh)