Import va eksport
Joriy ko‘rinishni CSV, Excel yoki JSON sifatida chiqarish — va qaytadan yuklash: barcha noto‘g‘ri katakchalar birdaniga xabar qilinadi, fayl to‘liq o‘qilmaguncha esa hech narsa yozilmaydi.
Mavjud v0.2.0
Eksport
Standart holatda yoqilgan. Ro‘yxat sahifasi joriy ko‘rinishning CSV, Excel va JSON formatlarini taklif qiladi — qo‘llangan filtrlar, qidiruv va tartiblash bilan birga — shunda fayl u olingan jadvalga mos keladi.
class ProductAdmin(admin.ModelAdmin):
exportable = True # the default
export_fields = ("sku", "name", "category", "price", "stock")
export_fields standart bo‘yicha list_displayga teng. Yozuvda mavjud,
biroq jadvalga sig‘maydigan ustunlarni qo‘shish uchun uni kengaytiring;
biror narsani faylga tushirmaslik uchun toraytiring.
exportable = False # a model whose rows should not leave the admin in a file
Ikki cheklov
FastFortSettings(admin={"export_limit": 50_000, "export_chunk_size": 1_000})
Eksport joriy so‘rovni sahifalashsiz bajaradi. Chegara bo‘lmasa, o‘n million qatorli jadvalda tasodifan bosilgan hammasini eksport qilish hech qachon tugamaydigan so‘rovga va boshqa hech kimga javob bermaydigan ma’lumotlar bazasiga aylanadi.
Qatorlar xotirada to‘planmasdan, qismlarga bo‘lib oqim tarzida uzatiladi.
Xuddi shu sababdan JSON writer hujjatni yozuvma-yozuv shakllantiradi — butun
ro‘yxat ustida json.dumpsni ishlatish uchun avval uning hammasi xotirada
bo‘lishi kerak bo‘lardi.
Eksportdagi geometriya
Ro‘yxat katakchasi geometriyani qisqacha ko‘rsatadi: Polygon · 14 points.
Eksport esa forma elementi ko‘rsatadigan matnning aynan o‘zini yozadi:
nuqtani lat, lng sifatida, qolgan hammasini EWKT sifatida.
Bu farq ataylab qilingan. Qisqacha ko‘rinish jadvalda o‘qish uchun to‘g‘ri narsa, ammo hech qanday import vositasi uni qayta poligonga aylantira olmaydi, import esa shu narsani va’da qiladi: tizim yozgan fayl — tizim qaytarib qabul qila oladigan fayl.
Import
Standart holatda o‘chirilgan, va bu nosimmetriklik aynan shu uchun: qatorlarni o‘qib chiqish — bu shlyuz allaqachon bergan ruxsat; bir so‘rovda bir necha ming qatorni yozish esa kimgadir tasodifan berib bo‘lmaydigan boshqa narsa. Qatorlari yon ta’sirga ega bo‘lgan model — jo‘natiladigan buyurtma, yuboriladigan xabar — buni standart tarzda meros qilib olish o‘rniga ataylab e’lon qilishi kerak.
class ProductAdmin(admin.ModelAdmin):
importable = True
import_fields = ("sku", "name", "price", "cost", "stock", "availability")
Bu /admin/catalog.product/import manzilini va uning yonida shablonni
yuklab olish havolasini qo‘shadi — to‘g‘ri sarlavhalar va bitta namuna
qatorga ega fayl, shunda birinchi urinish taxmin bo‘lmaydi.
import_fields hech qachon ruxsatni kengaytirmaydi
FieldSpec.editable birinchi bo‘lib tekshiriladi. Bu yerda faqat
o‘qish uchun mo‘ljallangan maydonni nomlash uni yozish uchun ochiq
qilmaydi — bunday yozuv tashlab yuboriladi.
U aynan toraytirish uchun mo‘ljallangan: narxlar ro‘yxati narx va zaxirani yangilashi mumkin, biroq yetkazib beruvchini hech qachon emas. U bo‘lmasa, standart holatda hech qanday fayl olib yura olmaydigan maydonlardan tashqari barcha yoziladigan maydonlar ishlatiladi — parollar, yuklamalar, ikkilik (binary) ustunlar va spesifikatsiya nozik (sensitive) deb belgilagan har qanday narsa.
Fayl bilan nima qilinadi
- Faylni butunlay tahlil qiladi, forma foydalanadigan aynan o‘sha
parserlar yordamida. Sana xuddi shu tarzda sana bo‘lib qoladi; geometriya
esa xuddi shu
geo.parseorqali o‘tadi. - Tashqi kalitlarni nom yoki id bo‘yicha aniqlaydi.
category12yokiCablesbo‘lishi mumkin; qidiruv maqsadli adminning o‘zsearch_fieldsidan foydalanadi. - Barcha noto‘g‘ri katakchalar haqida birdaniga, qator raqami bilan xabar beradi:
Row 4, price: "12,50" is not a number. Use a full stop for the decimal point.
Row 4, availability: "in stock" is not one of: in_stock, low_stock,
backorder, discontinued.
Row 9, category: no Category matches "Cabels".
Row 11, sku: a Product with this sku already exists.
4 problems. Nothing was written.
- Fayl to‘liq tahlil qilinmaguncha hech narsa yozmaydi. Yarim bajarilgan import importning umuman bo‘lmaganidan yomonroq, chunki operator qaysi yarmi bajarilganini aniqlashga majbur bo‘ladi.
O‘qish yo‘lida na pandas, na openpyxl
CSV standart kutubxona yordamida o‘qiladi. Excel esa ish kitobini
arxivdan chiqarib, varaq XML’ini aylanib chiqish orqali o‘qiladi —
openpyxl faqat yozish uchun, va faqat .xlsx eksportini xohlasangiz
kerak bo‘ladi.
Ko‘pchilik loyihalar yiliga ikki marta ishlatadigan funksiya uchun pandas’ni tortib keladigan freymvork — bu oqlab bo‘lmaydigan bog‘liqlikka aylangan freymvorkdir.
Hammasi birgalikda, bitta modelda
@admin.register(Product, key="catalog.product")
class ProductAdmin(admin.ModelAdmin):
list_display = ("sku", "name", "category", "price", "stock", "availability")
list_filter = ("availability", "is_active", "category")
search_fields = ("sku", "name")
exportable = True
export_fields = ("sku", "name", "category", "supplier", "price", "cost", "stock")
importable = True
import_fields = ("sku", "name", "price", "cost", "stock", "availability")
Backorder bo‘yicha filtrlang, eksport qiling, jadvalda zaxira ustunini tahrirlang, qaytadan yuklang. Chiqqan fayl — qaytadan kiritiladigan faylning o‘zi.