Как загрузить SQL fixture в Django для модели пользователя?
кто-нибудь знает, как загрузить исходные данные для auth.Пользователь, использующий SQL-светильники? Для моих моделей у меня просто есть .файл sql в папке с именем sql, что syncdb делает свою работу красиво. Но я понятия не имею, как это сделать для авт.Пользовательская модель. Я погуглил его, но безуспешно.
заранее спасибо,
Альдо
7 ответов
для SQL-светильников вам нужно будет специально иметь инструкции insert для auth
таблицы. Вы можете найти схему таблиц auth с помощью команды python manage.py sql auth
.
гораздо проще и независимо от базы данных (если у вас нет дополнительной магии SQL, которую вы хотите запустить), это просто сделать JSON или YAML приспособление файл в каталоге светильников вашего приложения с такими данными:
- model: auth.user
pk: 100000
fields:
first_name: Admin
last_name: User
username: admin
password: "<a hashed password>"
вы можете быстро сгенерировать хэшированный пароль в django Шелл!--6-->
>>> from django.contrib.auth.models import User
>>> u = User()
>>> u.set_password('newpass')
>>> u.password
'sha1$e2fd5edae9adc8870fd87a65c051e7fdace6226b5a8'
это будет загружаться всякий раз, когда вы запустите syncdb
.
вы ищете loaddata
:
manage.py loadata path/to/your/fixtureFile
но я думаю, что команда может иметь дело только с файлами в формате XML, YAML, Python или JSON (посмотреть здесь). Чтобы создать такие соответствующие файлы, посмотрите на dumpdata
метод.
Спасибо за ваши ответы. Я нашел решение, которое работает для меня, и для совпадения было одним из предложений Брайана. Вот это:
Firs я отключил сигнал, который создал суперпользователя после syncdb, потому что у меня есть суперпользователь в моем auth_user fixture:
models.py:
from django.db.models import signals
from django.contrib.auth.management import create_superuser
from django.contrib.auth import models as auth_app
signals.post_syncdb.disconnect(
create_superuser,
sender=auth_app,
dispatch_uid = "django.contrib.auth.management.create_superuser")
затем я создал сигнал для вызова после syncdb:
//management/__init__.py
"""
Loads fixtures for files in sql/<modelname>.sql
"""
from django.db.models import get_models, signals
from django.conf import settings
import <myproject>.<myapp>.models as auth_app
def load_fixtures(app, **kwargs):
import MySQLdb
db=MySQLdb.connect(host=settings.DATABASE_HOST or "localhost", \
user=settings.DATABASE_USER,
passwd=settings.DATABASE_PASSWORD, port=int(settings.DATABASE_PORT or 3306))
cursor = db.cursor()
try:
print "Loading fixtures to %s from file %s." % (settings.DATABASE_NAME, \
settings.FIXTURES_FILE)
f = open(settings.FIXTURES_FILE, 'r')
cursor.execute("use %s;" % settings.DATABASE_NAME)
for line in f:
if line.startswith("INSERT"):
try:
cursor.execute(line)
except Exception, strerror:
print "Error on loading fixture:"
print "-- ", strerror
print "-- ", line
print "Fixtures loaded"
except AttributeError:
print "FIXTURES_FILE not found in settings. Please set the FIXTURES_FILE in \
your settings.py"
cursor.close()
db.commit()
db.close()
signals.post_syncdb.connect(load_fixtures, sender=auth_app, \
dispatch_uid = "<myproject>.<myapp>.management.load_fixtures")
и в моем settings.py я добавил FIXTURES_FILE с путем к моему .файл sql с дампом sql.
одна вещь, которую я до сих пор не нашел, - это как запустить этот сигнал только после создания таблиц, а не каждый раз, когда syncdb запускается. Временная работа для этого-использовать INSERT IGNORE в моей команде sql.
Я знаю, что это решение далеко не идеально, и критики / улучшения / мнения добро пожаловать!
С уважением,
Альдо
есть трюк для этого: (проверено на Django 1.3.1)
устранение:
python manage.py startapp auth_fix
mkdir auth_fix/fixtures
python manage.py dumpdata auth > auth_fixtures/fixtures/initial_data.json
Include auth_fix in INSTALLED_APPS inside settings.py
в следующий раз python manage.py syncdb
, Django загрузит приспособление auth автоматически.
объяснение:
- просто сделайте пустое приложение для хранения папки fixtures. Покидать _init py, models.py и views.py в нем, чтобы Django распознал его как приложение, а не только папку.
- сделайте папку fixtures в приложении.
-
python manage.py dumpdata auth
сбросит данные "auth" в БД со всей информацией о группах и пользователях. Остальная часть команды просто перенаправляет вывод в файл с именем "initial_data.json", который ищет Django при запуске "syncdb". - просто включите auth_fix в INSTALLED_APPS внутри settings.py.
этот пример показывает, как это сделать в JSON, но вы можете в основном использовать формат по вашему выбору.
опция для импорта auth.Пользователь SQL вручную и впоследствии выгрузить его на стандартный Django приспособление (имя его initial_data, если вы хотите syncdb, чтобы найти его). Как правило, вы можете поместить этот файл в любое приложение fixtures dir, так как фиксированные данные будут все с соответствующим app_label. Или вы можете создать пустое / фиктивное приложение и разместить его там.
другой вариант-переопределить команду syncdb и применить приспособление так, как вы считаете нужным.
I согласитесь с Феликсом, что в Django нет нетривиального естественного крючка для заполнения приложений contrib SQL.
Если вы делаете миграции базы данных с юга, создание пользователей очень просто.
сначала создайте миграцию голых данных. Он должен быть включен в некоторые приложения. Если у вас есть общее приложение, в котором вы размещаете общий код, это было бы хорошим выбором. Если у вас есть приложение, в котором вы концентрируете пользовательский код, это было бы еще лучше.
$ python manage.py datamigration <some app name> add_users
соответствующий код миграции может выглядеть примерно так:
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models
from django.contrib.auth.models import User
class Migration(DataMigration):
users = [
{
'username': 'nancy',
'email': 'nancy@example.com',
'password': 'nancypassword',
'staff': True,
'superuser': True
},
{
'username': 'joe',
'email': '',
'password': 'joepassword',
'staff': True,
'superuser': False
},
{
'username': 'susan',
'email': 'susan@example.com',
'password': 'susanpassword',
'staff': False,
'superuser': False
}
]
def forwards(self, orm):
"""
Insert User objects
"""
for i in Migration.users:
u = User.objects.create_user(i['username'], i['email'], i['password'])
u.is_staff = i['staff']
u.is_superuser = i['superuser']
u.save()
def backwards(self, orm):
"""
Delete only these users
"""
for i in Migration.users:
User.objects.filter(username=i['username']).delete()
просто запустите миграцию, и пользователи auth должны быть вставлены.
$ python manage.py migrate <some app name>
Я просто добавил операторы SQL в пользовательский файл sql для другой модели. Я выбрал свою модель сотрудника, потому что она зависит от auth_user. Пользовательский SQL, который я написал, фактически читает из моего устаревшего приложения и извлекает из него информацию о пользователе и использует REPLACE, а не INSERT (я использую MySQL), поэтому я могу запускать его, когда захочу. И я поставил эту замену...Выберите оператор в процедуре, чтобы его можно было легко запустить вручную или по расписанию с помощью cron.