code: def copy_fields(self, model):
          
          fields = {}
          for field in self.fields_included(model):
              field = copy.copy(field)
              field.remote_field = copy.copy(field.remote_field)
              if isinstance(field, OrderWrt):
                  # OrderWrt is a proxy field, switch to a plain IntegerField
                  field.__class__ = models.IntegerField
              if isinstance(field, models.ForeignKey):
                  old_field = field
                  old_swappable = old_field.swappable
                  old_field.swappable = False
                  try:
                      _name, _path, args, field_args = old_field.deconstruct()
                  finally:
                      old_field.swappable = old_swappable
                  if getattr(old_field, "one_to_one", False) or isinstance(
                      old_field, models.OneToOneField
                  ):
                      FieldType = models.ForeignKey
                  else:
                      FieldType = type(old_field)
  
                  # If field_args['to'] is 'self' then we have a case where the object
                  # has a foreign key to itself. If we pass the historical record's
                  # field to = 'self', the foreign key will point to an historical
                  # record rather than the base record. We can use old_field.model here.
                  if field_args.get("to", None) == "self":
                      field_args["to"] = old_field.model
  
                  # Override certain arguments passed when creating the field
                  # so that they work for the historical field.
                  field_args.update(
                      db_constraint=False,
                      related_name="+",
                      null=True,
                      blank=True,
                      primary_key=False,
                      db_index=True,
                      serialize=True,
                      unique=False,
                      on_delete=models.DO_NOTHING,
                  )
                  field = FieldType(*args, **field_args)
                  field.name = old_field.name
              else:
                  transform_field(field)
              fields[field.name] = field
          return fields
docs: Creates copies of the model's original fields, returning
          a dictionary mapping field name to copied field object.