Данные дампа Django для одной модели?

Могу ли я выполнить dumpdata в Django только для одной модели, а не для всего приложения, и если да, то как?

Для приложения это будет:

python manage.py dumpdata myapp

Однако я хочу, чтобы какая-то конкретная модель, такая как "myapp.mymodel", была выгружена. Причина в том, что у меня есть огромные 3 миллиона записей плюс наборы данных в одном приложении, которые я не хотел бы сбрасывать.

13 ответов

Решение

Начиная с версии 1.1 и выше, Django dumpdata Команда управления позволяет вывести данные из отдельных таблиц:

./manage.py dumpdata myapp1 myapp2.my_model

Вы также можете разделить несколько приложений и моделей в командной строке. Вот каноническое определение:

django-admin dumpdata [app_label[.ModelName] [app_label[.ModelName] ...]]

Как уже отмечалось, вы не можете сделать это с помощью команды manage.py в Django 1.0. Однако вы можете использовать скрипт для экспорта файла JSON и загрузить его, используя 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()

От конкретной модели к конкретному файлу:

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

и чтобы загрузить его в другое приложение: сначала переместите или скопируйте файл в приложение, где вы хотите его обработать, затем:

      python manage.py loaddata specific_file.json

Взять все данные в формате JSON из модели Django.

Синтаксис:

python manage.py dumpdata app_name.model_name

Например, выгрузка данных из модели group_permission, которые находятся в приложении аутентификации по умолчанию в django.

python manage.py dumpdata auth.group_permission

Для вывода взгляните на консоль.

Я думаю, что у вас есть решение в вашем вопросе. Вы можете сбросить отдельную модель следующим образом:

./manage.py dumpdata myapp.my_model

Для успеха мне пришлось сказать это дважды и указать модель два раза, например:

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

Если бы я только сказал

./manage.py dumpdata myapp2 myapp2.my_model

Меня залили все модели в myapp2, несмотря на то, что я указал my_model.

Для новичков в Django и Python, таких как я, это может быть полезно:

если вы хотите вывести только одну строку (очевидно, из одной таблицы), и у вас есть, например, приложение «торговец», а модель также называется «Продавец», и вы обычно импортируете ее, используя полное имя, подобное этому : merchant.models.Merchant; даже не пытайтесь использовать это имя . Синтаксис следующий:

      # only dumps the merchant with id = 123, pretty printed
python manage.py dumpdata merchant.Merchant --pks 123 --indent 2

Если вы хотите сбросить только указанные объекты модели, вы можете использовать --pks дополнительного аргумента для dumpdata команды.

--pks PRIMARY_KEYS Выводит только объекты, указанные в списке первичных ключей, разделенных запятыми. Это доступно только при сбросе одной модели. По умолчанию выводятся все записи модели.

Чтобы записать это в конкретный файл:

python manage.py dumpdata app_label.ModelName app_label.ModelName2 > fixtures/specic.json

Я думаю, что принятый ответ устарел и нуждается в обновлении в 2023 году с подробным подходом.

У меня была аналогичная проблема, когда мне приходилось создавать приспособления для определенных моделей из разных приложений, имеющих определенные идентификаторы. Более того, мне нужно было создать только одно приспособление для всех моделей. так что нам не нужно загружать отдельные приборы, а только один прибор для всех моделей.

Я сделал все это, создав пользовательскую команду, которая вызываетdumpdataвнутренне для каждой конкретной модели с конкретными идентификаторами, такими как следующие:

продукты/models.py

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

обзоры/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)

И следуя команде, которая создает один прибор для определенных моделей из разных приложений с определенными идентификаторами:

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(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

Теперь вы можете запустить команду с таким идентификатором:

python manage.py generate_fixture 50

И фикстура моделей будет сгенерирована всего в одном файле фикстуры, который можно загрузить следующим образом:

python manage.py loaddata model_fixtures.json

Примечание. Код не тестировался.

Я создал команду управления для генерации прибора для каждой модели. Светильники можно сгенерировать, запустив:

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

код по адресу: https://gist.github.com/2394883

В качестве обходного пути вы можете создать другое приложение и скопировать модель, но указать ее на существующую таблицу с мета-опцией db_table. Затем вы можете просто скопировать скопированные модели в новое приложение. Ваше существующее приложение не будет затронуто.

Для сброса данных из конкретной модели для конкретного приложения.


Если мы возьмем ПРИМЕР, где у нас есть ОСНОВНОЙ ПРОЕКТ (мы назовем его проектом ), и в этом ОСНОВНОМ ПРОЕКТЕ у нас есть два (02) других приложения (мы назовем каждое приложение, например, это APP1 и APP2 ), мы можем сделать так


  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
Другие вопросы по тегам