سؤال

هل يعرف أحد كيفية تحميل البيانات الأولية للمصادف. USER باستخدام تركيبات SQL؟ بالنسبة للنماذج الخاصة بي، حصلت للتو على ملف <modelname> .sql في مجلد يدعى SQL الذي يقوم به SyncDB هو الوظيفة بشكل جميل. لكن ليس لدي أدنى فكرة عن كيفية القيام بذلك لنموذج Auth.USER. لقد غوغضها، ولكن دون نجاح.

شكرا مقدما،

الدو

هل كانت مفيدة؟

المحلول 3

شكرا لإجاباتك. لقد وجدت الحل الذي يعمل من أجلي، والصدفة كان أحد اقتراح براين. ها هو:

Firs أنا قطعت الإشارة التي أنشأت المستخدم السوبر بعد 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> / ادارة / __ 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. أضفت fictures_file مع المسار إلى ملف .sql الخاص بي باستخدام تفريغ SQL.

الشيء الوحيد الذي ما زلت لم أجده هو كيفية إطلاق هذه الإشارة فقط بعد إنشاء الجداول، ولا يتم إطلاق Syncdb في كل مرة. يعمل العمل المؤقت حول هذا الاستخدام في إدراج تجاهل في أمر SQL الخاص بي.

أعلم أن هذا الحل بعيد عن الكمال والنقاد / التحسينات / الآراء موضع ترحيب كبير!

يعتبر،

الدو

نصائح أخرى

بالنسبة لتركيبات 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.

أنت تبحث عن loaddata:

manage.py loadata path/to/your/fixtureFile

ولكن أعتقد أن الأمر يمكن أن يتعامل فقط مع الملفات في XML أو YAML أو PYTHON أو JSON (انظر هنا). لإنشاء مثل هذه الملفات المناسبة، إلقاء نظرة على dumpdata طريقة.

هناك خدعة لهذا: (تم اختباره على 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 لاعبا اساسيا المصادقة تلقائيا.

تفسير:

  1. فقط قم بإجراء تطبيق فارغ لعقد مجلد تركيبات. اترك __init__py، Models.py.pains.py في ذلك حتى يتعرف Django على أنه تطبيق وليس مجرد مجلد.
  2. جعل مجلد تركيبات في التطبيق.
  3. python manage.py dumpdata auth سوف تفريغ بيانات "مصادقة" في DB مع جميع المجموعات ومعلومات المستخدمين. يقوم بقية الأمر ببساطة بإعادة توجيه الإخراج إلى ملف يسمى "INIVITAL_DATA.JSON" وهو الذي يبحث عنه django عند تشغيل "SyncDB".
  4. فقط قم بتضمين Auth_Fix في Office_Apps داخل Settings.py.

يوضح هذا المثال كيفية القيام بذلك في JSON ولكن يمكنك استخدام تنسيق اختيارك في الأساس.

يتمثل أحد الخيارات في استيراد Auth.User SQL الخاص بك يدويا وتفريغه لاحقا إلى تركيبات DJango القياسية (الاسم IT IMPLIGY_DATA إذا كنت تريد SyncDB للعثور عليه). يمكنك عموما وضع هذا الملف في أي تطبيق Firectures DIR لأن البيانات المضمونة سيتم تقليصها جميعا مع App_Label المناسبة. أو يمكنك إنشاء تطبيق فارغ / دمية ووضعه هناك.

خيار آخر هو تجاوز أمر SyncDB وتطبيق اللاسترام بطريقة كما ترى مناسبا.

أنا أتفق مع فيليكس أنه لا يوجد خطوط طبيعية غير تافهة في django لملء تطبيقات المساهمة مع 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()

ثم قم ببساطة بتشغيل الترحيل ويجب إدراج مستخدمي المصادقة.

$ python manage.py migrate <some app name>

قمت ببساطة بإضافة بيانات SQL إلى ملف SQL المخصص لطراز آخر. اخترت نموذج الموظف الخاص بي لأنه يعتمد على Auth_User. كتب SQL المخصص الذي كتبته فعلا من طلبي إرث وسحب معلومات المستخدم منه، ويستخدم استبدال بدلا من إدراج (أنا أستخدم MySQL) حتى أتمكن من تشغيله كلما أردت. وأضع ذلك استبدال ... حدد عبارة في إجراء بحيث يكون من السهل تشغيل يدويا أو مجددا مع كرون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top