コード例 #1
0
    def find_fixtures(self, fixture_label):
        """
        Finds fixture files for a given label.
        """
        fixture_name, ser_fmt, cmp_fmt = self.parse_name(fixture_label)
        databases = [self.using, None]
        cmp_fmts = list(self.compression_formats.keys()) if cmp_fmt is None else [cmp_fmt]
        ser_fmts = serializers.get_public_serializer_formats() if ser_fmt is None else [ser_fmt]

        if self.verbosity >= 2:
            self.stdout.write("Loading '%s' fixtures..." % fixture_name)

        if os.path.isabs(fixture_name):
            fixture_dirs = [os.path.dirname(fixture_name)]
            fixture_name = os.path.basename(fixture_name)
        else:
            fixture_dirs = self.fixture_dirs
            if os.path.sep in os.path.normpath(fixture_name):
                fixture_dirs = [os.path.join(dir_, os.path.dirname(fixture_name))
                                for dir_ in fixture_dirs]
                fixture_name = os.path.basename(fixture_name)

        suffixes = (
            '.'.join(ext for ext in combo if ext)
            for combo in product(databases, ser_fmts, cmp_fmts)
        )

        if fixture_name == "*":
            search_name = ""
        else:
            search_name = fixture_name

        targets = set('.'.join((search_name, suffix)) for suffix in suffixes)

        fixture_files = []
        for fixture_dir in fixture_dirs:
            if self.verbosity >= 2:
                self.stdout.write("Checking %s for fixtures..." % humanize(fixture_dir))
            fixture_files_in_dir = []
            for candidate in glob.iglob(os.path.join(fixture_dir, search_name + '*')):
                if any([os.path.basename(candidate).endswith(t) for t in targets]):
                    # Save the fixture_dir and fixture_name for future error messages.
                    fixture_files_in_dir.append((candidate, fixture_dir, fixture_name))

            if self.verbosity >= 2 and not fixture_files_in_dir:
                self.stdout.write("No fixture '%s' in %s." %
                                  (fixture_name, humanize(fixture_dir)))

            # Check kept for backwards-compatibility; it isn't clear why
            # duplicates are only allowed in different directories.
            # Commented out from django
            # if len(fixture_files_in_dir) > 1:
            #    raise CommandError(
            #        "Multiple fixtures named '%s' in %s. Aborting." %
            #        (fixture_name, humanize(fixture_dir)))
            fixture_files.extend(fixture_files_in_dir)

        return fixture_files
コード例 #2
0
    def find_fixtures(self, fixture_label='aristotle_help_files'):
        """
        Finds fixture files for a given label.
        """

        fixture_name, ser_fmt = self.parse_name(fixture_label)
        databases = [self.using, None]
        ser_fmts = serializers.get_public_serializer_formats() if ser_fmt is None else [ser_fmt]

        if self.verbosity >= 2:
            self.stdout.write("Loading '%s' fixtures..." % fixture_name)

        if os.path.isabs(fixture_name):
            fixture_dirs = [os.path.dirname(fixture_name)]
        else:
            fixture_dirs = self.fixture_dirs
            if os.path.sep in os.path.normpath(fixture_name):
                fixture_dirs = [os.path.join(dir_, os.path.dirname(fixture_name))
                                for dir_ in fixture_dirs]

        suffixes = (
            '.'.join(ext for ext in combo if ext)
            for combo in product(databases, ser_fmts)
        )

        fixture_name = "*"
        search_name = ""
        targets = set('.'.join((search_name, suffix)) for suffix in suffixes)

        fixture_files = []

        for fixture_dir in fixture_dirs:
            if self.verbosity >= 2:
                self.stdout.write("Checking %s for fixtures..." % humanize(fixture_dir))
            fixture_files_in_dir = []
            for dir_name, sub, candidates in os.walk(fixture_dir):  # , search_name + '*')):
                for candidate in candidates:
                    candidate = os.path.join(dir_name, candidate)
                    if any([os.path.basename(candidate).endswith(t) for t in targets]):
                        # Save the fixture_dir and fixture_name for future error messages.
                        fixture_files_in_dir.append((candidate, fixture_dir, candidate.split('/')[-1]))

            dest_static_dir = os.path.join(settings.STATIC_ROOT, "aristotle_help")
            src = os.path.join(fixture_dir, 'static')
            if not os.path.exists(dest_static_dir):
                os.makedirs(dest_static_dir)
            if os.path.exists(src):
                from distutils import dir_util
                dir_util.copy_tree(src, dest_static_dir)

            # Check kept for backwards-compatibility; it isn't clear why
            # duplicates are only allowed in different directories.
            # Commented out from django
            # if len(fixture_files_in_dir) > 1:
            #    raise CommandError(
            #        "Multiple fixtures named '%s' in %s. Aborting." %
            #        (fixture_name, humanize(fixture_dir)))
            fixture_files.extend(fixture_files_in_dir)

        return fixture_files
コード例 #3
0
    def load_label(self, fixture_label):
        """
        Loads fixtures files for a given label.
        """
        show_progress = self.verbosity >= 3
        for fixture_file, fixture_dir, fixture_name in self.find_fixtures(fixture_label):
            _, ser_fmt, cmp_fmt = self.parse_name(os.path.basename(fixture_file))
            open_method, mode = self.compression_formats[cmp_fmt]
            fixture = open_method(fixture_file, mode)
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write(
                        "Installing %s fixture '%s' from %s." %
                        (ser_fmt, fixture_name, humanize(fixture_dir))
                    )

                objects = serializers.deserialize(
                    ser_fmt, fixture,
                    using=self.using, ignorenonexistent=self.ignore
                )

                for obj in objects:
                    objects_in_fixture += 1
                    if router.allow_migrate_model(self.using, obj.object.__class__):
                        loaded_objects_in_fixture += 1
                        self.models.add(obj.object.__class__)
                        try:
                            if self.update:
                                keys = dict([
                                    (key, getattr(obj.object, key))
                                    for key in obj.object.unique_together
                                ])
                                vals = dict([
                                    (k, v)
                                    for k, v in model_to_dict(obj.object).items()
                                    if v is not None
                                    ])

                                item, created = obj.object.__class__.objects.get_or_create(
                                    defaults=vals,
                                    **keys
                                )
                                if not created:
                                    if show_progress:
                                        self.stdout.write(
                                            'Updated an object(s).',
                                            ending=''
                                        )
                                    for k, v in vals.items():
                                        setattr(item, k, v)
                                    item.save()
                            else:
                                obj.object.save()
                            if show_progress:
                                self.stdout.write(
                                    '\rProcessed %i object(s).' % loaded_objects_in_fixture,
                                    ending=''
                                )
                        except (DatabaseError, IntegrityError) as e:
                            e.args = ("Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s" % {
                                'app_label': obj.object._meta.app_label,
                                'object_name': obj.object._meta.object_name,
                                'pk': obj.object.pk,
                                'error_msg': force_text(e)
                            },)
                            raise
                if objects and show_progress:
                    self.stdout.write('')  # add a newline after progress indicator
                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e),)
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name,
                    RuntimeWarning
                )
    def find_fixtures(self, fixture_label='aristotle_help_files'):
        """
        Finds fixture files for a given label.
        """

        fixture_name, ser_fmt = self.parse_name(fixture_label)
        databases = [self.using, None]
        ser_fmts = serializers.get_public_serializer_formats(
        ) if ser_fmt is None else [ser_fmt]

        if self.verbosity >= 2:
            self.stdout.write("Loading '%s' fixtures..." % fixture_name)

        if os.path.isabs(fixture_name):
            fixture_dirs = [os.path.dirname(fixture_name)]
        else:
            fixture_dirs = self.fixture_dirs
            if os.path.sep in os.path.normpath(fixture_name):
                fixture_dirs = [
                    os.path.join(dir_, os.path.dirname(fixture_name))
                    for dir_ in fixture_dirs
                ]

        suffixes = ('.'.join(ext for ext in combo if ext)
                    for combo in product(databases, ser_fmts))

        fixture_name = "*"
        search_name = ""
        targets = set('.'.join((search_name, suffix)) for suffix in suffixes)

        fixture_files = []

        for fixture_dir in fixture_dirs:
            if self.verbosity >= 2:
                self.stdout.write("Checking %s for fixtures..." %
                                  humanize(fixture_dir))
            fixture_files_in_dir = []
            for dir_name, sub, candidates in os.walk(
                    fixture_dir):  # , search_name + '*')):
                for candidate in candidates:
                    candidate = os.path.join(dir_name, candidate)
                    if any([
                            os.path.basename(candidate).endswith(t)
                            for t in targets
                    ]):
                        # Save the fixture_dir and fixture_name for future error messages.
                        fixture_files_in_dir.append(
                            (candidate, fixture_dir, candidate.split('/')[-1]))

            dest_static_dir = os.path.join(settings.STATIC_ROOT,
                                           "aristotle_help")
            src = os.path.join(fixture_dir, 'static')
            if not os.path.exists(dest_static_dir):
                os.makedirs(dest_static_dir)
            if os.path.exists(src):
                from distutils import dir_util
                dir_util.copy_tree(src, dest_static_dir)

            # Check kept for backwards-compatibility; it isn't clear why
            # duplicates are only allowed in different directories.
            # Commented out from django
            # if len(fixture_files_in_dir) > 1:
            #    raise CommandError(
            #        "Multiple fixtures named '%s' in %s. Aborting." %
            #        (fixture_name, humanize(fixture_dir)))
            fixture_files.extend(fixture_files_in_dir)

        return fixture_files
    def load_label(self):
        """
        Loads fixtures files for a given label.
        """
        show_progress = self.verbosity >= 3
        for fixture_file, fixture_dir, fixture_name in self.find_fixtures():
            _, ser_fmt = self.parse_name(os.path.basename(fixture_file))
            fixture = open(fixture_file, 'rb')
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write(
                        "Installing %s fixture '%s' from %s." %
                        (ser_fmt, fixture_name, humanize(fixture_dir)))

                objects = serializers.deserialize(
                    ser_fmt,
                    fixture,
                    using=self.using,
                    ignorenonexistent=self.ignore)

                for obj in objects:
                    objects_in_fixture += 1
                    if router.allow_migrate_model(self.using,
                                                  obj.object.__class__):
                        loaded_objects_in_fixture += 1
                        self.models.add(obj.object.__class__)
                        try:
                            keys = dict([(key, getattr(obj.object, key))
                                         for key in obj.object.unique_together
                                         ])
                            if self.update:
                                vals = dict([(k, v) for k, v in model_to_dict(
                                    obj.object).items() if v is not None])

                                item, created = obj.object.__class__.objects.get_or_create(
                                    defaults=vals, **keys)
                                if not created:
                                    if show_progress:
                                        self.stdout.write(
                                            'Updated an object(s).', ending='')
                                    for k, v in vals.items():
                                        setattr(item, k, v)
                                    item.save()
                            else:
                                if not obj.object.__class__.objects.filter(
                                        **keys).exists():
                                    obj.object.save()
                            if show_progress:
                                self.stdout.write('\rProcessed %i object(s).' %
                                                  loaded_objects_in_fixture,
                                                  ending='')
                        except (DatabaseError, IntegrityError) as e:
                            e.args = (
                                "Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s"
                                % {
                                    'app_label': obj.object._meta.app_label,
                                    'object_name':
                                    obj.object._meta.object_name,
                                    'pk': obj.object.pk,
                                    'error_msg': force_text(e)
                                }, )
                            raise
                if objects and show_progress:
                    self.stdout.write(
                        '')  # add a newline after progress indicator
                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = ("Problem installing fixture '%s': %s" %
                              (fixture_file, e), )
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name, RuntimeWarning)
コード例 #6
0
    def load_label(self, fixture_label):
        """
        Loads fixtures files for a given label.
        """
        for fixture_file, fixture_dir, fixture_name in (
                self.find_fixtures(fixture_label)):
            _, ser_fmt, cmp_fmt = self.parse_name(
                os.path.basename(fixture_file))
            open_method, mode = self.compression_formats[cmp_fmt]
            fixture = open_method(fixture_file, mode)
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write(
                        "Installing %s fixture '%s' from %s." %
                        (ser_fmt, fixture_name, humanize(fixture_dir)))

                objects = Deserializer(fixture,
                                       using=self.using,
                                       ignorenonexistent=self.ignore,
                                       state=self.state)

                for obj in objects:
                    objects_in_fixture += 1
                    if is_django_1_7:
                        router_allow = router.allow_migrate
                    else:
                        router_allow = router.allow_migrate_model
                    if router_allow(self.using, obj.object.__class__):
                        loaded_objects_in_fixture += 1
                        self.models.add(obj.object.__class__)
                        try:
                            obj.save(using=self.using)
                        except (DatabaseError, IntegrityError) as e:
                            e.args = (
                                "Could not load %(app_label)s."
                                "%(object_name)s(pk=%(pk)s): "
                                "%(error_msg)s" % {
                                    'app_label': obj.object._meta.app_label,
                                    'object_name':
                                    (obj.object._meta.object_name),
                                    'pk': obj.object.pk,
                                    'error_msg': force_text(e)
                                }, )
                            raise

                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = ("Problem installing fixture '%s': %s" %
                              (fixture_file, e), )
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name, RuntimeWarning)
    def load_label(self, fixture_label):
        """
        Loads fixtures files for a given label. This method is largely copied
        from django.core.management.commands.loaddata.Command but with the
        addition of using bulk_create where possible.
        """
        show_progress = self.verbosity >= 3
        for fixture_file, fixture_dir, fixture_name in self.find_fixtures(
                fixture_label):
            _, ser_fmt, cmp_fmt = self.parse_name(
                os.path.basename(fixture_file))
            open_method, mode = self.compression_formats[cmp_fmt]
            fixture = open_method(fixture_file, mode)
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write(
                        "Installing %s fixture '%s' from %s." %
                        (ser_fmt, fixture_name, humanize(fixture_dir)))

                objects = serializers.deserialize(
                    ser_fmt,
                    fixture,
                    using=self.using,
                    ignorenonexistent=self.ignore,
                )

                models_in_file = set()
                objects_to_create = []
                for obj in objects:
                    objects_in_fixture += 1
                    if (obj.object._meta.app_config in self.excluded_apps
                            or type(obj.object) in self.excluded_models):
                        continue
                    if router.allow_migrate_model(self.using,
                                                  obj.object.__class__):
                        self.models.add(obj.object.__class__)
                        models_in_file.add(obj.object.__class__)
                        objects_to_create.append(obj)

                if len(models_in_file) == 1:
                    model = list(models_in_file)[0]
                    try:
                        model_objects = []
                        m2m_related_objects = defaultdict(list)
                        for obj in objects_to_create:
                            model_objects.append(obj.object)
                            if obj.m2m_data:
                                for accessor_field, m2m_list in obj.m2m_data.items(
                                ):
                                    m2m_rel = getattr(model,
                                                      accessor_field).rel
                                    related_model = m2m_rel.model
                                    through_model = m2m_rel.through

                                    for m2m_id in m2m_list:
                                        model_id_field = '{}_id'.format(
                                            model._meta.model_name)
                                        related_model_id_field = '{}_id'.format(
                                            related_model._meta.model_name)
                                        m2m_related_objects[
                                            through_model].append(
                                                through_model(
                                                    **{
                                                        model_id_field:
                                                        obj.object.pk,
                                                        related_model_id_field:
                                                        m2m_id
                                                    }))

                        model.objects.bulk_create(model_objects)
                        for m2m_model in m2m_related_objects:
                            m2m_model.objects.bulk_create(
                                m2m_related_objects[m2m_model])
                        loaded_objects_in_fixture += len(objects_to_create)
                        if show_progress:
                            self.stdout.write('\rProcessed %i object(s).' %
                                              loaded_objects_in_fixture,
                                              ending='')
                    except (DatabaseError, IntegrityError) as e:
                        e.args = (
                            "Could not load %(app_label)s.%(object_name)s: %(error_msg)s"
                            % {
                                'app_label': model._meta.app_label,
                                'object_name': model._meta.object_name,
                                'error_msg': force_text(e)
                            }, )
                        raise
                else:
                    for obj in objects_to_create:
                        try:
                            obj.save(using=self.using)
                            loaded_objects_in_fixture += 1
                            if show_progress:
                                self.stdout.write('\rProcessed %i object(s).' %
                                                  loaded_objects_in_fixture,
                                                  ending='')
                        except (DatabaseError, IntegrityError) as e:
                            e.args = (
                                "Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s"
                                % {
                                    'app_label': obj.object._meta.app_label,
                                    'object_name':
                                    obj.object._meta.object_name,
                                    'pk': obj.object.pk,
                                    'error_msg': force_text(e)
                                }, )
                            raise
                if objects and show_progress:
                    self.stdout.write(
                        '')  # add a newline after progress indicator
                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = ("Problem installing fixture '%s': %s" %
                              (fixture_file, e), )
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name, RuntimeWarning)
コード例 #8
0
    def load_label(self, fixture_label):
        """
        Loads fixtures files for a given label.
        """
        for fixture_file, fixture_dir, fixture_name in (
                self.find_fixtures(fixture_label)):
            _, ser_fmt, cmp_fmt = self.parse_name(
                os.path.basename(fixture_file))
            open_method, mode = self.compression_formats[cmp_fmt]
            fixture = open_method(fixture_file, mode)
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write(
                        "Installing %s fixture '%s' from %s." %
                        (ser_fmt, fixture_name, humanize(fixture_dir)))

                objects = Deserializer(
                    fixture, using=self.using, ignorenonexistent=self.ignore,
                    state=self.state)

                for obj in objects:
                    objects_in_fixture += 1
                    if is_django_1_7:
                        router_allow = router.allow_migrate
                    else:
                        router_allow = router.allow_migrate_model
                    if router_allow(
                            self.using, obj.object.__class__):
                        loaded_objects_in_fixture += 1
                        self.models.add(obj.object.__class__)
                        try:
                            obj.save(using=self.using)
                        except (DatabaseError, IntegrityError) as e:
                            e.args = (
                                "Could not load %(app_label)s."
                                "%(object_name)s(pk=%(pk)s): "
                                "%(error_msg)s" % {
                                    'app_label': obj.object._meta.app_label,
                                    'object_name': (
                                        obj.object._meta.object_name),
                                    'pk': obj.object.pk,
                                    'error_msg': force_text(e)
                                },)
                            raise

                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = (
                        "Problem installing fixture '%s': %s" %
                        (fixture_file, e),)
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name,
                    RuntimeWarning
                )
コード例 #9
0
    def load_label(self, fixture_label):
        """Load fixtures files for a given label."""
        show_progress = self.verbosity >= 3
        for fixture_file, fixture_dir, fixture_name in self.find_fixtures(fixture_label):
            _, ser_fmt, cmp_fmt = self.parse_name(os.path.basename(fixture_file))
            open_method, mode = self.compression_formats[cmp_fmt]
            fixture = open_method(fixture_file, mode)
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write(
                        "Installing %s fixture '%s' from %s."
                        % (ser_fmt, fixture_name, humanize(fixture_dir))
                    )

                objects = serializers.deserialize(
                    ser_fmt, fixture, using=self.using, ignorenonexistent=self.ignore,
                )

                for obj in objects:
                    objects_in_fixture += 1
                    if (obj.object._meta.app_config in self.excluded_apps or
                            type(obj.object) in self.excluded_models):
                        continue
                    if router.allow_migrate_model(self.using, obj.object.__class__):
                        loaded_objects_in_fixture += 1
                        model = obj.object.__class__
                        self.models.add(model)
                        try:
                            obj.object.validate_unique()
                        except ValidationError as e:
                            if hasattr(model.objects, "get_natural_fields"):
                                fields = model.objects.get_natural_fields()
                            else:
                                fields = e.message_dict.keys()
                            existing_object = model.objects.get(**{k: getattr(obj.object, k) for k in fields})
                            obj.object.pk = existing_object.pk
                        try:
                            obj.save(using=self.using)
                            if show_progress:
                                self.stdout.write(
                                    '\rProcessed %i object(s).' % loaded_objects_in_fixture,
                                    ending=''
                                )
                        # psycopg2 raises ValueError if data contains NUL chars.
                        except (DatabaseError, IntegrityError, ValueError) as e:
                            e.args = ("Could not load %(app_label)s.%(object_name)s(pk=%(pk)s): %(error_msg)s" % {
                                'app_label': obj.object._meta.app_label,
                                'object_name': obj.object._meta.object_name,
                                'pk': obj.object.pk,
                                'error_msg': e,
                            },)
                            raise
                if objects and show_progress:
                    self.stdout.write('')  # add a newline after progress indicator
                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e),)
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name,
                    RuntimeWarning
                )
コード例 #10
0
    def load_label(self, fixture_label):
        """
        Loads fixtures files for a given label using the queryset's bulk_create method.
        """
        show_progress = self.verbosity >= 3
        for fixture_file, fixture_dir, fixture_name in self.find_fixtures(
                fixture_label):
            _, ser_fmt, cmp_fmt = self.parse_name(
                os.path.basename(fixture_file))
            open_method, mode = self.compression_formats[cmp_fmt]
            fixture = open_method(fixture_file, mode)
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write(
                        "Installing %s fixture '%s' from %s." %
                        (ser_fmt, fixture_name, humanize(fixture_dir)))

                objects = serializers.deserialize(
                    ser_fmt,
                    fixture,
                    using=self.using,
                    ignorenonexistent=self.ignore)

                create_dict = OrderedDict()

                for object in objects:
                    obj = object.object
                    objects_in_fixture += 1
                    model = obj.__class__
                    if router.allow_migrate_model(self.using, model):
                        self.models.add(model)
                        if model in create_dict.keys():
                            create_dict[model].append(obj)
                        else:
                            create_dict[model] = [obj]
                for model in create_dict.keys():
                    objs = create_dict[model]
                    loaded_objects_in_fixture += len(objs)
                    try:
                        model.objects.using(self.using).bulk_create(objs)
                        if show_progress:
                            self.stdout.write('\rProcessed %i object(s).' %
                                              loaded_objects_in_fixture,
                                              ending='')
                    except (DatabaseError, IntegrityError) as e:
                        e.args = (
                            "Could not load %(app_label)s.%(object_name)s: %(error_msg)s"
                            % {
                                'app_label': model._meta.app_label,
                                'object_name': model._meta.object_name,
                                'error_msg': force_text(e)
                            }, )
                        raise
                if objects and show_progress:
                    self.stdout.write(
                        '')  # add a newline after progress indicator
                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = ("Problem installing fixture '%s': %s" %
                              (fixture_file, e), )
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name, RuntimeWarning)
コード例 #11
0
    def load_label(self, fixture_label):
        """
        Loads fixtures files for a given label using the queryset's bulk_create method.
        """
        show_progress = self.verbosity >= 3
        for fixture_file, fixture_dir, fixture_name in self.find_fixtures(fixture_label):
            _, ser_fmt, cmp_fmt = self.parse_name(os.path.basename(fixture_file))
            open_method, mode = self.compression_formats[cmp_fmt]
            fixture = open_method(fixture_file, mode)
            try:
                self.fixture_count += 1
                objects_in_fixture = 0
                loaded_objects_in_fixture = 0
                if self.verbosity >= 2:
                    self.stdout.write("Installing %s fixture '%s' from %s." %
                        (ser_fmt, fixture_name, humanize(fixture_dir)))

                objects = serializers.deserialize(ser_fmt, fixture,
                    using=self.using, ignorenonexistent=self.ignore)

                create_dict = OrderedDict()

                for object in objects:
                    obj = object.object
                    objects_in_fixture += 1
                    model = obj.__class__
                    if router.allow_migrate_model(self.using, model):
                        self.models.add(model)
                        if model in create_dict.keys():
                            create_dict[model].append(obj)
                        else:
                            create_dict[model] = [obj]
                for model in create_dict.keys():
                    objs = create_dict[model]
                    loaded_objects_in_fixture += len(objs)
                    try:
                        model.objects.using(self.using).bulk_create(objs)
                        if show_progress:
                            self.stdout.write(
                                '\rProcessed %i object(s).' % loaded_objects_in_fixture,
                                ending=''
                                )
                    except (DatabaseError, IntegrityError) as e:
                        e.args = ("Could not load %(app_label)s.%(object_name)s: %(error_msg)s" % {
                                'app_label': model._meta.app_label,
                                'object_name': model._meta.object_name,
                                'error_msg': force_text(e)
                        },)
                        raise
                if objects and show_progress:
                    self.stdout.write('')  # add a newline after progress indicator
                self.loaded_object_count += loaded_objects_in_fixture
                self.fixture_object_count += objects_in_fixture
            except Exception as e:
                if not isinstance(e, CommandError):
                    e.args = ("Problem installing fixture '%s': %s" % (fixture_file, e),)
                raise
            finally:
                fixture.close()

            # Warn if the fixture we loaded contains 0 objects.
            if objects_in_fixture == 0:
                warnings.warn(
                    "No fixture data found for '%s'. (File format may be "
                    "invalid.)" % fixture_name,
                    RuntimeWarning
                )