آشنایی کامل با Fixtures در Django: ایجاد، بارگذاری، کشف، ترتیب اجرا و نکات مهم

این مقاله مفهوم Fixture در Django را توضیح می‌دهد و نحوهٔ ایجاد، بارگذاری، محل جستجو، ترتیب بارگذاری، رفتار سیگنال‌ها، استفاده از فایل‌های فشرده، و مدیریت Fixtureهای مخصوص دیتابیس را بررسی می‌کند. Fixtures ابزاری قدرتمند برای بارگذاری داده‌های اولیه، داده‌های تست و داده‌های قابل حمل در پروژه‌های Django هستند.

Django Fixtures، loaddata، dumpdata، FIXTURE_DIRScompressed fixtures، raw=Trueinitial data

~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, **

نوشته و پژوهش شده توسط دکتر شاهین صیامی