如何在Django中为用户模型加载sql fixture?

ald*_*dux 13 sql django fixture fixtures

有谁知道如何使用sql fixture加载auth.User的初始数据?对于我的模型,我在一个名为sql的文件夹中有一个<modelname> .sql文件,syncdb可以很好地完成它的工作.但我不知道如何为auth.User模型做到这一点.我用谷歌搜索了它,但没有成功.

提前致谢,

阿尔

Der*_*mer 23

对于SQL fixture,您必须具有auth表的insert语句.您可以使用该命令找到auth表的模式python manage.py sql auth.

更简单且与数据库无关的方式(除非你想要运行一些额外的SQL魔法),只需在应用程序的fixtures目录中创建一个JSON或YAML fixture文件,其数据如下:

- model: auth.user
  pk: 100000
  fields:
    first_name: Admin
    last_name: User
    username: admin
    password: "<a hashed password>"
Run Code Online (Sandbox Code Playgroud)

您可以在django shell中快速生成哈希密码

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

无论何时运行,都会加载syncdb.


Fel*_*ing 8

您正在寻找loaddata:

manage.py loadata path/to/your/fixtureFile
Run Code Online (Sandbox Code Playgroud)

但我认为该命令只能处理XML,YAML,Python或JSON格式的文件(参见此处).要创建这样的适当文件,请查看该dumpdata方法.


ald*_*dux 5

感谢您的回答。我找到了适合我的解决方案,巧合的是布莱恩的建议之一。这里是:

首先,我在syncdb之后断开了创建超级用户的信号,因为我的超级用户在我的auth_user装置中:

模型.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")
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个在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")
Run Code Online (Sandbox Code Playgroud)

在我的settings.py中,我添加了 FIXTURES_FILE 以及带有 sql 转储的 .sql 文件的路径。

我还没有找到的一件事是如何仅在创建表后触发此信号,而不是每次触发syncdb 时。解决这个问题的临时方法是在我的 sql 命令中使用 INSERT IGNORE INTO 。

我知道这个解决方案远非完美,非常欢迎批评/改进/意见!

问候,

奥尔多


小智 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. 在应用程序中创建设备文件夹。
  3. python manage.py dumpdata auth将转储数据库中的“auth”数据以及所有组和用户信息。命令的其余部分只是将输出重定向到一个名为“initial_data.json”的文件中,这是 Django 在您运行“syncdb”时查找的文件。
  4. 只需在 settings.py 中的 INSTALLED_APPS 中包含 auth_fix。

此示例显示了如何在 JSON 中执行此操作,但您基本上可以使用您选择的格式。