Django dump data for a single model?
Asked Answered
K

13

183

Can I perform a dumpdata in Django on just a single model, rather than the whole app, and if so, how?

For an app it would be:

python manage.py dumpdata myapp

However, I want some specific model, such as "myapp.mymodel" to be dumped. The reason being, I have some huge, 3 million records plus, datasets in the same app that I would not like dumped.

Kilocalorie answered 11/7, 2009 at 6:34 Comment(1)
I find your question not easy to understand. You want to load an SQL dump into your database? Or you want to do some sort of toString() on and instance of a model?Stateroom
P
301

As of version 1.1 and greater, the Django dumpdata management command allows you to dump data from individual tables:

./manage.py dumpdata myapp1 myapp2.my_model

You can also separate multiple apps and models on the command line. Here's the canonical definition:

django-admin dumpdata [app_label[.ModelName] [app_label[.ModelName] ...]]
Precise answered 11/7, 2009 at 7:19 Comment(3)
gath, didn't understood the negative vote on post which is almost 2 years old. Moreover above code worked fine even with v1.1 . New features in new releases doesn't make older answers invalid.Precise
And how do I add this data at another instance of the app?.Myrmeco
To make human readable json use flag --indent 4 after dumpdataKaryn
A
118

As noted, you can't do this through a manage.py command in Django 1.0. However you could use a script to export the JSON file, and load it using loaddata:

from django.core import serializers
from myproject.myapp import models
data = serializers.serialize("json", models.MyModel.objects.all())
out = open("mymodel.json", "w")
out.write(data)
out.close()
Abby answered 11/7, 2009 at 10:51 Comment(3)
This is a great script because you can get even more granular if you'd like. If you instead do a .filter(...) on line three above you can dump just the specific records you want.Gloam
Is there a way to dump many-to-many field values for several objects with this?Therron
I think I'll try github.com/davedash/django-fixture-magicTherron
S
22

A specific model to a specific file:

python manage.py dumpdata app_label.ModelName > specific_file.json

and to load it to another app: first move or copy the file to the app where you want process it, then:

python manage.py loaddata specific_file.json
Spann answered 9/2, 2021 at 6:11 Comment(0)
S
12

Take all data into json format from django model.

Syntax:

python manage.py dumpdata app_name.model_name

For example dumping data from group_permission model which reside in default auth app in django.

python manage.py dumpdata auth.group_permission

For output take a look on console.

Syncarpous answered 7/8, 2017 at 20:10 Comment(0)
G
6

I think you had the solution in your question. You can dump an individual model like this:

./manage.py dumpdata myapp.my_model
Gypsum answered 11/7, 2009 at 6:59 Comment(1)
i tried it before posting. had no luck. i'm in django 1.0. also tried myapp.models.mymodel?Kilocalorie
G
5

For success I had to say it twice, and specify the model two times, like:

./manage.py dumpdata myapp2.my_model myapp2.my_model

If I only said

./manage.py dumpdata myapp2 myapp2.my_model

I got flooded with all the models in myapp2, despite the fact that I specified my_model.

Gherlein answered 20/5, 2015 at 21:32 Comment(0)
H
3

For newbies in Django and Python like me, this might be useful:

if you want to only dump a single row (of, obviously, a single table) and you have for example the app "merchant" and the model is also named "Merchant", and you usually import it using a fully qualified name like this: merchant.models.Merchant; do not even try to use this name. The syntax is as follows:

# only dumps the merchant with id = 123, pretty printed
python manage.py dumpdata merchant.Merchant --pks 123 --indent 2
Hoosegow answered 10/3, 2021 at 19:47 Comment(0)
C
2

To write it on specific file:

python manage.py dumpdata app_label.ModelName app_label.ModelName2 > fixtures/specic.json
Caty answered 19/11, 2019 at 6:19 Comment(0)
Y
2

If you want to dump only the specified objects of a model, you can use the --pks optional argument for the dumpdata command.

--pks PRIMARY_KEYS Outputs only the objects specified by a comma separated list of primary keys. This is only available when dumping one model. By default, all the records of the model are output.

Yenta answered 2/10, 2020 at 9:4 Comment(0)
B
2

I think the accepted answer is old and needs a refresher in 2023 with the detailed approach.

I had the similar problem where I had to create fixtures for specific models from different apps having specific id's. Moreover I had to create just one fixture for all models. so that we don't have to load individual fixtures rather just one fixture for all models.

I did all of this by creating a custom command that calls the dumpdata internally for each specific model with the specific ids like the following:

products/models.py

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits = 5, decimal_places = 2)

reviews/models.py

class Review(models.Model):
    title = models.CharField(max_length=200)        
    text = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    rating = models.PositiveIntegerField(default=0)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

    def natural_key(self):
       return self.title, self.timestamp


class Response(models.Model):
    text = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)

And following is the command that creates one fixtures for specific models from different apps with specific id's:

generate_fixture.py

from django.core.management import BaseCommand, call_command
from io import StringIO
import json

class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument('id', type=int, help='Primary Key Of Product')

    def handle(self, *args, **options):
        id = options.get('id')

        if product := Product.objects.filter(id=id).first():
            product_fixture = self.get_fixture('products.Product', str(id))

            review_ids = list(
                Review.objects.filter(product__id=id).values_list('id',flat=True)
            )
            review_ids = ','.join([str(review_id) for review_id in review_ids])
            review_fixture = self.get_fixture('reviews.Review', review_ids)

            output = [json.loads(product_fixture)]
            output.extend(json.loads(review_fixture))
            with open('model_fixtures.json', "w") as file:
                json.dump(output, file)
        else:
            print(f"Product with id {id} does not exists!")

    def get_fixture(self, label, pks):
        args = ['dumpdata', '--natural-foreign', '--natural-primary', label]
        with StringIO() as buffer:
            call_command(*args, pks=pks, stdout=buffer)
            data = buffer.getvalue()
        return data

Now you can run the command with the id like this:

python manage.py generate_fixture 50

And fixture of the models will be generated in just one fixture file which can be loaded like this:

python manage.py loaddata model_fixtures.json

Barrator answered 3/2, 2023 at 19:39 Comment(2)
This was useful, thank you! The code I modified from this basically worked except the first parameter to get_fixture needs to be 'self' and we need to be careful about the format that's output so that it works with the loaddata command https://mcmap.net/q/137596/-django-deserialization-error-problem-installing-fixtureGimpel
Thanks @MikeS for pointing out the typo. If you think anything else needs to be changed feel free to edit the answer.Barrator
P
1

As a workaround you could make another app and copy the model but point it to the existing table with the db_table meta option. Then you could just dump the models you copied into the new app. You existing app wouldn't be affected.

Parliamentarianism answered 11/7, 2009 at 7:34 Comment(0)
F
1

I've created a management command the generate a fixture on a per model basis. Fixtures can be generated by running:

./manage generate_fixtures app.model.MyModel --file=dump/MyModel.json

code at: https://gist.github.com/2394883

Fortitude answered 15/4, 2012 at 21:26 Comment(0)
A
0

For DUMPING data out of the specific model for specific APP.


If we take EXAMPLE where we have in a MAIN PROJECT (We go call it project) and in this MAIN PROJECT we have two (02) others applications (We go call each app like this APP1 and APP2) we can do like that


  1. python manage.py dumpdata APP1.name_of_model >APP1/fixtures/name_of_model .json
  2. python manage.py dumpdata APP2.name_of_model >APP2/fixtures/name_of_model .json
Alannaalano answered 13/5, 2022 at 10:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.