1

私は Django (バージョン 1.5.1 を使用) が初めてで、この問題に苦労しています。

Question と Image の 2 つのモデルがあります。各質問には多くの画像を含めることができ、各画像は 1 つの質問にのみ関連付けることができます。質問を追加し、各質問に複数の画像を追加できる管理インターフェイスを作成しようとしています。

問題は、読み取りと書き込みのスキームが異なる 2 つのデータベースがあることです。匿名ユーザーがデータを読み取る場合、デフォルトのデータベースを使用する必要があり、これは機能します。一方、管理者は、管理インターフェイスを介して「リモート」と呼ばれるセカンダリ データベースに対してデータの読み取りと書き込みの両方を行う必要があります。この理由は複雑すぎて説明できません。

とにかく、質問と画像の両方を「リモート」データベースに保存する必要があります。質問はそこに保存されますが、画像は何らかの理由でデフォルトのデータベースに保存されます。formfield_for_foreignkeys 関数が機能するはずだと思いました。「リモート」データベースから必要に応じて読み取りますが(インラインクエリ機能のため?)、もちろん画像は見つかりません。デフォルト データベースへのクエリは画像を検索しますが、質問は検索しません。

これが私のコードです

from django.contrib import admin
from questionservice.models import Question, Image

class ImageTabularInline(admin.TabularInline):
    model = Image
    extra = 1
    using = 'remote'

    def queryset(self, request):
        return super(ImageTabularInline, self).queryset(request).using(self.using)

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        return super(ImageTabularInline, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs)

    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        return super(ImageTabularInline, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)

class QuestionModelAdmin(admin.ModelAdmin):
    inlines = [ImageTabularInline]
    using = 'remote'

    def save_model(self, request, obj, form, change):
        obj.save(using=self.using)

    def delete_model(self, request, obj):
        obj.delete(using=self.using)

    def queryset(self, request):
        return super(QuestionModelAdmin, self).queryset(request).using(self.using)

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        return super(QuestionModelAdmin, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs)

    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        return super(QuestionModelAdmin, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)

admin.site.register(Question, QuestionModelAdmin)

ルーターも使用してみましたが、管理インターフェイスをルーティングして他のデータベースから読み取る方法が見つかりませんでした。

何か案は?ありがとうございました!

4

1 に答える 1

0

OK、ネットワーク化されたデータベースにのみ書き込みを行うことができる場合は、とにかくネットワーク上にいるときにのみ変更を行うことができます. したがって、どのデータベースに書き込むかをいじる代わりに、設定を 2 つの部分に分割します。

  • 管理者のみにアクセスできるサーバーで、ネットワーク sqlitedb を指すデフォルトのデータベースがあります。
  • 管理者にアクセスできないラップトップで実行される「クライアント」。デフォルトのデータベースはローカルの sqlite db を指しています。

ファイル構造は次のようになります。

|-- project
| |-- static
| |-- templates
| |-- settings
| | |-- __init__.py
| | |-- base.py    # All your common settings
| | |-- server.py  # DATABASES = {'default': 'NAME':'\\server\netshare\remote.sq3'}}
| | `-- client.py  # DATABASES = {'default': 'NAME':'local.sq3'}}
| |-- urls_server.py # anchors admin to root url
| |-- urls_client.py # does not embed admin
| `-- wsgi.py
`-- manage.py

そして、あなたはそれらを実行することができます

./manage.py runserver --settings=project.settings.server
  OR
./manage.py runserver --settings=project.settings.client
于 2013-06-14T08:51:08.623 に答える