2017-08-24 9 views
6

私はsyncdbmakemigrationsを認識していますが、実稼働環境ではこれを行うことに制限されています。Django admin - スーパユーザではなくスーパーユーザに見えるモデル

最近、製造時に作成されたいくつかのテーブルがありました。予想どおり、管理者はどのユーザーでも表は表示されませんでした。私たちは、生産SQLに手動で実行2つのクエリの下に持っていた、ということ
ポスト(私は私の地元での移行を実行し、生のSQLをフェッチするためにshow create table問い合わせをしました)

たdjango_content_type

INSERT INTO django_content_type(name, app_label, model) 
values ('linked_urls',"urls", 'linked_urls'); 

auth_permission

INSERT INTO auth_permission (name, content_type_id, codename) 
values 
('Can add linked_urls Table', (SELECT id FROM django_content_type where model='linked_urls' limit 1) ,'add_linked_urls'), 
('Can change linked_urls Table', (SELECT id FROM django_content_type where model='linked_urls' limit 1) ,'change_linked_urls'), 
('Can delete linked_urls Table', (SELECT id FROM django_content_type where model='linked_urls' limit 1) ,'delete_linked_urls'); 

今すぐthiそのモデルはスーパユーザの下で見ることができ、スタッフユーザへのアクセスを許可することもできるが、スタッフユーザはそれを見ることができない。
入力する必要があるテーブルエントリはありますか?

またはこの問題を解決する方法が他にありませんsyncdb移行

+0

_staff_ usersのグループが存在する可能性があります。あなたはそれに許可を与えましたか? –

+0

はい、また、どのグループにも属していないスタンドアロンスタッフのユーザーがたくさんいます! – NoobEditor

+0

次に、ユーザーグループ「staff」を作成して、すべてのスタッフのユーザーに割り当てることをお勧めします。私はそうではありませんが、1つのSQLコマンドで割り当てを処理することも可能でなければなりません。 –

答えて

1

だから、最後に、私はsolution.Iはジャンゴのデバッグの多くを行なったし、apparanetly(django.contrib.auth.backends)関数の下に持っていた権限を提供するための仕事をしていません。

​​

だから問題は何ですか?

問題は、このクエリで嘘をついた:

INSERT INTO django_content_type(name, app_label, model) 
values ('linked_urls',"urls", 'linked_urls'); 

は最初は正常に見えるが、実際のクエリが実行されました:

--# notice the caps case here - it looked so trivial, i didn't even bothered to look into it untill i realised what was happening internally 
INSERT INTO django_content_type(name, app_label, model) 
values ('Linked_Urls',"urls", 'Linked_Urls'); 

migrateを行う際に、内部的に、Djangoは、すべてが下に移行されることを保証しますケース - これは問題です!

私は以前のすべての挿入と小文字に別のクエリを実行しました。voila

3

最近、製造時に作成されたテーブルがいくつかありました。

私はあなたがそこに書いたものを2通りの方法で読むことができます。

最初の方法:Djangoに対応するモデルがないSQLステートメントでテーブルを作成しました。これが当てはまる場合、Djangoが突然テーブルを使用するようなコンテンツの種類やアクセス権に煩わされることはありません。テーブルのモデルを作成する必要があります。多分彼らはunmanagedになるでしょうが、彼らは存在する必要があります。

第2の方法:Djangoの対応するモデルは存在しますが、手動でテーブルを作成するだけで問題はありません。私はこのケースで行いたいことは、次のコードを実行され、説明がコードの後に​​続く:上記のコードは、本質的に後Djangoはを行い、作業を実行されない何

from django.contrib.contenttypes.management import update_contenttypes 
from django.apps import apps as configured_apps 
from django.contrib.auth.management import create_permissions 

for app in configured_apps.get_app_configs(): 
    update_contenttypes(app, interactive=True, verbosity=0) 

for app in configured_apps.get_app_configs(): 
    create_permissions(app, verbosity=0) 

それは、マイグレーションを実行します。マイグレーションが発生するとDjangoは必要に応じてテーブルを作成し、完了するとupdate_contenttypesを呼び出し、プロジェクトに定義されたモデルに関連付けられたテーブルをスキャンし、追加する必要があるテーブルをdjango_content_typeテーブルに追加します。次に、create_permissionsを呼び出して、追加が必要な追加/変更/削除のアクセス許可でauth_permissionsを更新します。上記のコードを使用して、アクセス許可を早く作成するようにしました。during a migrationたとえば、新しい権限を参照する必要のあるグループを作成するデータ移行がある場合に便利です。

+0

それはあなたが言及した2番目の方法です。今、私の問題は、prod/pre-prod上のシェル上のものを実行するアクセス権がありません。クエリを実行するDBAに渡すことができる生の '仕事を終わらせる? – NoobEditor

+0

この問題はありません。任意のDjango管理コマンドは、Pythonコードから 'django.core.management.call_command'を呼び出すことで実行できます。その関数をラップするビューを作成する場合は、必要なものを実行できます。しかし、疑わしいときには、Pythonからコマンドを呼び出すこともできますし、そのようなDjangoビューは[subprocess](https://docs.python.org/3/library/subprocess.html)ライブラリを使用して表示することもできます。そして、両方の方法で移行を実行できます。 – Melvyn

関連する問題