~2 دقیقه مطالعه • بروزرسانی ۱۹ اسفند ۱۴۰۴
۱. Fixture چیست؟
Fixture مجموعهای از فایلهاست که دادههای سریالشدهٔ دیتابیس را در خود نگه میدارند. هر Fixture یک نام یکتا دارد و میتواند شامل چندین فایل در مسیرهای مختلف باشد.
کاربردهای رایج Fixtures:
- بارگذاری دادهٔ اولیه (initial data)
- پر کردن دیتابیس تستها
- اشتراکگذاری دادههای ثابت بین اپلیکیشنها
۲. چگونه Fixture تولید کنیم؟
سادهترین روش استفاده از دستور dumpdata است:
python manage.py dumpdata app.Model --indent 2 > mydata.json
همچنین میتوان Fixture را دستی نوشت یا از ابزارهای serialization استفاده کرد.
۳. چگونه Fixture را استفاده کنیم؟
۳.۱ در تستها
class MyTestCase(TestCase):
fixtures = ["fixture-label"]
۳.۲ با دستور loaddata
django-admin loaddata
۴. Django چگونه Fixtures را پیدا میکند؟
Django در مسیرهای زیر به دنبال Fixture میگردد:
- پوشهٔ fixtures/ در هر اپ نصبشده
- مسیرهای تعریفشده در
FIXTURE_DIRS - مسیر literal که کاربر وارد کرده
۴.۱ اگر پسوند فایل را مشخص کنید
django-admin loaddata mydata.json
فقط فایلهای JSON با نام mydata بارگذاری میشوند.
۴.۲ اگر پسوند را حذف کنید
django-admin loaddata mydata
Django همهٔ انواع Fixture (json، xml و …) را جستجو میکند.
۴.۳ استفاده از مسیرهای تو در تو
django-admin loaddata foo/bar/mydata.json
در این حالت Django مسیرهای زیر را بررسی میکند:
<app>/fixtures/foo/bar/mydata.json<dir in FIXTURE_DIRS>/foo/bar/mydata.json- مسیر literal
۵. ترتیب بارگذاری Fixtures
اگر چند Fixture را با هم فراخوانی کنید، ترتیب همان است که وارد کردهاید:
django-admin loaddata mammals birds insects
یا در تستها:
class AnimalTestCase(TestCase):
fixtures = ["mammals", "birds", "insects"]
نکته مهم: اگر دیتابیس شما از deferred constraint checking پشتیبانی نکند، روابط بین Fixtureها ممکن است باعث خطا شود.
۶. نحوهٔ ذخیرهٔ دادهٔ Fixture در دیتابیس
هنگام بارگذاری Fixture:
- متد save() مدلها اجرا نمیشود
- سیگنالها با
raw=Trueفراخوانی میشوند - فقط فیلدهای موجود در Fixture مقداردهی میشوند
۶.۱ غیرفعالکردن سیگنالها هنگام loaddata
def my_handler(**kwargs):
if kwargs["raw"]:
return
...
۶.۲ استفاده از decorator
from functools import wraps
def disable_for_loaddata(handler):
@wraps(handler)
def wrapper(*args, **kwargs):
if kwargs["raw"]:
return
return handler(*args, **نوشته و پژوهش شده توسط دکتر شاهین صیامی