Để thay đổi khóa chính với nam bạn có thể sử dụng lệnh south.db.create_primary_key trong datamigration. Để thay đổi pk tùy chỉnh CharField của bạn để chuẩn AutoField bạn nên làm:
1) tạo lĩnh vực mới trong mô hình của bạn
class MyModel(Model):
id = models.AutoField(null=True)
1,1) nếu bạn có một khóa ngoại trong một số mô hình khác để mô hình này, tạo mới hiện trường giả fk bằng các mô hình quá (sử dụng IntegerField, nó sẽ sau đó được chuyển đổi)
class MyRelatedModel(Model):
fake_fk = models.IntegerField(null=True)
2) tạo di cư về phía nam tự động và di chuyển:
./manage.py schemamigration --auto
./manage.py migrate
3) tạo datamigration mới
./manage.py datamigration <your_appname> fill_id
trong tis datamigration điền những id mới và các lĩnh vực fk với những con số (chỉ cần liệt kê chúng)
for n, obj in enumerate(orm.MyModel.objects.all()):
obj.id = n
# update objects with foreign keys
obj.myrelatedmodel_set.all().update(fake_fk = n)
obj.save()
db.delete_primary_key('my_app_mymodel')
db.create_primary_key('my_app_mymodel', ['id'])
4) trong mô hình của bạn thiết lập primary_key = True trên trường pk mới của bạn
id = models.AutoField(primary_key=True)
5) xóa trường khóa chính cũ (nếu không cần thiết) tạo tự động migra tion và di chuyển.
5.1) nếu bạn có các phím nước ngoài - xóa cũ lĩnh vực trọng điểm nước ngoài quá (di chuyển)
6) Bước cuối cùng - khôi phục quan hệ then chốt fireign. Tạo lĩnh vực fk thực một lần nữa, và xóa lĩnh vực fake_fk của bạn, tạo di cư tự NHƯNG KHÔNG di chuyển - bạn cần phải sửa đổi di cư tự động tạo ra (!): Thay vì tạo fk mới và xóa fake_fk - đổi tên cột fake_fk
# in your models
class MyRelatedModel(Model):
# delete fake_fk
# fake_fk = models.InegerField(null=True)
# create real fk
mymodel = models.FoeignKey('MyModel', null=True)
# in migration
def forwards(self, orm):
# left this without change - create fk field
db.add_column('my_app_myrelatedmodel', 'mymodel',
self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name='lots', to=orm['my_app.MyModel']),keep_default=False)
# remove fk column and rename fake_fk
db.delete_column('my_app_myrelatedmodel', 'mymodel_id')
db.rename_column('my_app_myrelatedmodel', 'fake_fk', 'mymodel_id')
Vì vậy, trước đó điền fake_fk trở thành một cột, có chứa dữ liệu quan hệ thực tế, và nó không bị mất sau khi tất cả các bước trên.
Ông có thể cho chúng ta thấy mô hình của bạn? –
@tomlog: xem http://stackoverflow.com/questions/2011629/unicode-error-when-saving-an-object-in-django-admin Có một ví dụ. Tôi di chuyển để thêm một id như pk – luc
FWIW, không có gì sai khi đặt tên cho khóa chính, miễn là cơ sở dữ liệu của bạn sử dụng chính xác các chỉ mục. – Tobu