Django Fixtures Tutorial: How to use dumpdata and loaddata
Updated
Table of Contents
A fixture is a collection of data that can be dumped or loaded into a Django database. It is serialized into a text-based format such as JSON or XML and used to provide initial data for local development or pre-populate a database with content for tests. Used properly, fixtures are a powerful feature that can improve all Django developer's productivity.
Create a Fixture with dumpdata
If you already have an existing Django project, it is possible to "dump" the database data into a fixture using the dumpdata management command. The basic syntax is as follows:
$ python manage.py dumpdata [app_name.ModelName]
For example, use the following command to dump the entire database into a file called db.json
(JSON is the default file format).
$ python manage.py dumpdata > db.json
The resulting db.json
file can then be viewed and used. If you are using VSCode to view the resulting JSON file, a quick tip to organize the code is to type Shift + Alt + F
on Windows or Shift + Option + F
on macOS.
It is also possible to dump only a specific model. For example, if you had a books
app and only wanted to dump the Author
model, you could output the data into a db_books_author.json
file.
$ python manage.py dumpdata books.Author > db_books_author.json
Load a Fixture Using loaddata
To populate a database using a fixture, use the loaddata management command with the following basic syntax:
$ python manage.py loaddata fixture_file
So, for example, if you deleted your SQLite database in a Django project and wanted to reload it with a db.json
fixture containing all its contents, you would use the following command:
$ python manage.py loaddata db.json
Tips for Using Fixtures
- Testing: Fixtures are beneficial for automated testing when you need a known set of data to test against.
- Compression: If you have very large fixtures, it is possible to compress them using the
bz2
,gz
,lzma
, orxz
formats. - Secret Data: Be mindful of secret or sensitive data within your fixtures. If you are storing or distributing them, ensure they don't include private information.
- Versioning: Django models often evolve throughout a project's lifetime, and fixtures must be updated alongside these changes. Use versioning to track updates to your fixtures over time.
- Natural Keys: Using a natural key can make fixtures more readable, however, ensure any natural keys are unique to prevent future conflicts.
Conclusion
Fixtures are a robust and proven way to manage data within Django applications. They make it much easier to import/export content and help with automated testing. While they come with a few limitations--most notably around security--they are an essential tool in a professional Django developers toolkit.