Saya mengalami masalah saat memuat perlengkapan Django ke database MySQL saya karena konflik tipe konten. Pertama saya mencoba membuang data hanya dari aplikasi saya seperti ini:
./manage.py dumpdata escola > fixture.json
tetapi saya terus mendapatkan masalah kunci asing yang hilang, karena aplikasi saya "escola" menggunakan tabel dari aplikasi lain. Saya terus menambahkan aplikasi tambahan sampai saya mendapatkan ini:
./manage.py dumpdata contenttypes auth escola > fixture.json
Sekarang masalahnya adalah pelanggaran batasan berikut ketika saya mencoba memuat data sebagai perlengkapan uji:
IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")
Tampaknya masalahnya adalah Django sedang mencoba membuat ulang tipe konten secara dinamis dengan nilai kunci utama berbeda yang bertentangan dengan nilai kunci utama dari perlengkapan. Tampaknya ini sama dengan bug yang didokumentasikan di sini: http://code.djangoproject.com/ticket/7052
Masalahnya adalah solusi yang disarankan adalah membuang aplikasi contenttypes yang sudah saya lakukan !? Apa yang memberi? Jika ada bedanya, saya memiliki beberapa izin model khusus seperti yang didokumentasikan di sini: http://docs.djangoproject.com/en/dev/ref/models/options/#permissions
-e contenttypes -e auth.permission
dengan--natural
? Saya hanya mencoba tanpa--natural
opsi dan berhasil. Juga dokumentasi di sini mengatakan seseorang harus menggunakan opsi ini jika DUMPINGauth.permission
dancontenttypes
.ContentType
danPermission
tidak dijamin mendapatkan id yang sama seperti sebelumnya. Dump data Anda berisi id yang mungkin mereferensikan objek berbeda pada database lain tempat Anda akan memuat data. Ini mungkin berhasil untuk Anda karena salah satu alasan berikut: 1) data Anda tidak memiliki referensi ke objek ini 2) ID asli dari Permission / ContentTypes dipertahankan 3) loaddata Anda berhasil tetapi Anda sebenarnya memiliki data yang rusak karena objek mengacu pada objek yang salah dan Anda belum mengetahuinya--natural
sekarang sudah tidak digunakan lagi demi--natural-foreign
(dan--natural-primary
)manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
--natural
sekarang telah dihapus sepenuhnya, tidak hanya usang. Gunakan--natural-foreign
atau--natural-primary
sebagai gantinya.Ya, ini sangat menjengkelkan. Untuk sementara saya mengatasinya dengan melakukan "manage.py reset" pada aplikasi contenttypes sebelum memuat fixture (untuk menyingkirkan data contenttypes yang dibuat secara otomatis yang berbeda dari versi yang dibuang). Itu berhasil, tetapi akhirnya saya muak dengan kerepotan dan perlengkapan yang ditinggalkan sepenuhnya demi SQL langsung (tentu saja, Anda kehilangan portabilitas DB).
update - jawaban terbaik adalah menggunakan
--natural
flag todumpdata
, seperti yang tercantum dalam jawaban di bawah. Bendera itu belum ada saat saya menulis jawaban ini.sumber
Coba lewati jenis konten saat membuat perlengkapan:
Ini berfungsi untuk saya dalam situasi yang sama untuk pengujian unit, wawasan Anda tentang jenis konten sangat membantu!
sumber
Jawabannya di sini semua tua ... Pada 2017, jawaban terbaik adalah:
sumber
Saya tidak menggunakan MySQL tetapi mengimpor beberapa data dari server langsung ke sqlite. Menghapus
contenttypes
data aplikasi sebelum melakukanloaddata
triknya:Lalu
sumber
Saya telah menyelesaikan masalah ini dalam kasus pengujian saya dengan menyetel ulang aplikasi jenis konten dari pengujian unit sebelum memuat file dump saya. Carl menyarankan ini sudah menggunakan
manage.py
perintah dan saya melakukan hal yang sama hanya dengan menggunakancall_command
metode:full_test_data.json
Perlengkapan saya berisi dump app contenttypes yang sesuai dengan data pengujian lainnya. Dengan mengatur ulang aplikasi sebelum memuat, ini mencegah kunci duplikatIntegrityError
.sumber
Ini berhasil untuk saya. Di sini saya tidak memasukkan semuanya ke model yang sebenarnya.
sumber
Anda perlu menggunakan kunci alami untuk mewakili kunci asing dan hubungan banyak ke banyak. Selain itu, mungkin ada baiknya untuk mengecualikan
session
tabel disessions
aplikasi, danlogentry
tabel diadmin
aplikasi.Django 1.7+
Django <1.7
Menurut dokumentasi Django ,
--natural
sudah tidak digunakan lagi dalam versi 1.7, jadi opsi--natural-foreign
harus digunakan sebagai gantinya.Anda juga dapat menghilangkan kunci utama dalam data serial dari objek ini karena dapat dihitung selama deserialisasi dengan meneruskan
--natural-primary
bendera.sumber
akan berubah
untuk
Dan perlengkapan berfungsi untuk
TestCase
saat inisumber
Django 2.2.5
itu membantu saya
sumber
Saya akan memberikan kemungkinan jawaban lain yang baru saja saya temukan. Mungkin itu akan membantu OP, mungkin itu akan membantu orang lain.
Saya punya tabel hubungan banyak-ke-banyak. Ini memiliki kunci utama dan dua kunci asing ke tabel lainnya. Saya menemukan bahwa jika saya memiliki sebuah entri di fixture yang dua kunci asing adalah sama seperti entri lain yang sudah di meja dengan berbeda pk , itu akan gagal. Tabel hubungan M2M memiliki "unik bersama" untuk dua kunci asing.
Jadi, jika itu adalah hubungan M2M yang rusak, lihat kunci asing yang ditambahkannya, lihat database Anda untuk melihat apakah pasangan FK tersebut sudah terdaftar di bawah PK yang berbeda.
sumber
Benar-benar menjengkelkan .. Aku selalu digigit ini.
Saya mencoba membuang data dengan --exclude contenttypes dan --natural, saya selalu mendapat masalah ..
Apa yang terbaik bagi saya adalah melakukan a
truncate table django_content_type;
setelah syncdb dan KEMUDIAN memuat data.Tentu saja untuk pemuatan otomatis initial_data.json Anda gagal.
sumber
Saya mengalami kesalahan serupa beberapa waktu lalu. Ternyata saya mencoba memuat perlengkapan sebelum membuat tabel yang diperlukan. Jadi saya melakukan:
Dan itu bekerja dengan sangat baik
sumber
Dalam kasus saya, saya telah membuang data dari
auth
(./manage.py dumpddata auth > fixtures/auth.json
) untuk menggunakan fixture untuk tujuan pengujian.Pengembangan berlanjut dan saya menghapus sebagian besar model yang telah saya definisikan
models.py
dan inilah saat saya mulai melihat masalah yang mengganggu ini.Solusi saya adalah meregenerasi fixture auth.json lagi. Yang ini telah menghapus banyak entri yang
auth.permission
terkait dengan model lama yang saya miliki.sumber
Saya mencoba setiap metode dari atas, Tidak ada yang berhasil untuk saya. Saya harus mengecualikan model autentikasi lengkap dan berfungsi dengan baik.
sumber