16

SQLフィクスチャを使用してauth.Userの初期データをロードする方法を知っている人はいますか? 私のモデルでは、sql という名前のフォルダーに < modelname >.sql ファイルがあり、syncdb が見事に機能します。しかし、auth.User モデルでそれを行う方法がわかりません。私はそれをグーグルで検索しましたが、成功しませんでした。

前もって感謝します、

アルド

4

7 に答える 7

23

SQL フィクスチャの場合は、特に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 シェルでハッシュ化されたパスワードをすばやく生成できます

>>> from django.contrib.auth.models import User
>>> u = User()
>>> u.set_password('newpass')
>>> u.password
'sha1$e2fd5$96edae9adc8870fd87a65c051e7fdace6226b5a8'

これは、実行するたびにロードされますsyncdb

于 2011-02-23T19:55:28.167 に答える
8

あなたが探しているloaddata

manage.py loadata path/to/your/fixtureFile

ただし、このコマンドはXML、YAML、Python、またはJSON形式のファイルしか処理できないと思います(ここを参照)。このような適切なファイルを作成するには、dumpdataメソッドを確認してください。

于 2010-03-09T20:37:23.957 に答える
5

これにはトリックがあります:(Django 1.3.1でテスト済み)

解決:

  1. python manage.py startapp auth_fix
  2. mkdir auth_fix/fixtures
  3. python manage.py dumpdata auth > auth_fixtures/fixtures/initial_data.json
  4. Include auth_fix in INSTALLED_APPS inside settings.py

次に を実行するpython manage.py syncdbと、Django は auth フィクスチャを自動的にロードします。

説明:

  1. フィクスチャ フォルダを保持する空のアプリを作成するだけです。__init__py、models.py、views.py をそのまま残して、Django が単なるフォルダーではなくアプリとして認識できるようにします。
  2. アプリで Fixtures フォルダーを作成します。
  3. python manage.py dumpdata authすべてのグループおよびユーザー情報を含む「認証」データを DB にダンプします。コマンドの残りの部分は、出力を "initial_data.json" というファイルにリダイレクトするだけです。このファイルは、"syncdb" を実行したときに Django が検索するファイルです。
  4. settings.py 内の INSTALLED_APPS に auth_fix を含めるだけです。

この例では、JSON で行う方法を示していますが、基本的には任意の形式を使用できます。

于 2011-09-30T18:56:45.097 に答える
4

回答ありがとうございます。私は自分に合った解決策を見つけました.偶然にも、ブライアンの提案の1つでした. ここにあります:

最初に、syncdb の後にスーパー ユーザーを作成したシグナルを切断しました。これは、auth_user フィクスチャにスーパー ユーザーがあるためです。

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 の後に呼び出されるシグナルを作成しました。

< myproject >/< myapp >/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に、SQLダンプを含む.sqlファイルへのパスを含むFIXTURES_FILEを追加しました。

私がまだ見つけていないことの 1 つは、syncdb が起動されるたびにではなく、テーブルが作成された後にのみこのシグナルを起動する方法です。これに対する一時的な回避策は、SQL コマンドで INSERT IGNORE INTO を使用することです。

私はこの解決策が完璧にはほど遠いことを知っています。批評家/改善/意見は大歓迎です!

よろしく、

アルド

于 2010-03-10T14:51:19.483 に答える
3

オプションとして、auth.User SQLを手動でインポートし、その後、標準のDjangoフィクスチャにダンプします(syncdbで検出する場合は、initial_dataという名前を付けます)。フィクスチャされたデータはすべて適切なapp_labelでキー設定されるため、通常、このファイルを任意のアプリのフィクスチャディレクトリに配置できます。または、空/ダミーのアプリを作成してそこに配置することもできます。

もう1つのオプションは、syncdbコマンドをオーバーライドし、適切と思われる方法でフィクスチャを適用することです。

私はFelixに同意します。Djangoには、contribアプリにSQLを取り込むための重要な自然なフックはありません。

于 2010-03-09T23:07:28.270 に答える
3

サウスでデータベースの移行を行っている場合、ユーザーの作成は非常に簡単です。

まず、ベア データ移行を作成します。一部のアプリケーションに含める必要があります。共有コードを配置する共通のアプリがある場合は、それが適切な選択です。ユーザー関連のコードが集中するアプリがあれば、さらに良いでしょう。

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

次に、移行を実行するだけで、認証ユーザーが挿入されます。

$ python manage.py migrate <some app name>
于 2011-11-05T22:50:29.610 に答える
1

別のモデルのカスタム sql ファイルに SQL ステートメントを追加しただけです。auth_user に依存するため、Employee モデルを選択しました。私が作成したカスタム SQL は、実際にはレガシー アプリケーションから読み取り、そこからユーザー情報を取得し、INSERT ではなく REPLACE を使用する (私は MySQL を使用しています) ため、いつでも実行できます。そして、その REPLACE...SELECT ステートメントをプロシージャーに入れて、手動で簡単に実行したり、cron でスケジュールしたりできるようにしました。

于 2013-04-10T12:27:16.170 に答える