1

我是 Django 新手(使用 1.5.1 版)并且一直在努力解决这个问题。

我有两个模型:问题和图像。每个问题可以有多个图像,每个图像只能与一个问题相关。我正在尝试制作一个管理界面,可以在其中添加问题并为每个问题添加多个图像。

问题是我有两个具有不同读写方案的数据库。当匿名用户读取数据时,它应该使用默认数据库,这很有效。另一方面,管理员应该通过管理界面读取和写入数据到名为“远程”的辅助数据库。其原因太复杂无法解释。

无论如何,我需要将问题和图像都保存到“远程”数据库中。问题在那里保存得很好,但由于某种原因,图像被保存到默认数据库中。我认为 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

好的,所以如果您只能写入网络数据库,那么无论如何您只能在网络上进行更改。因此,与其纠结于要写入哪个数据库,不如将您的配置分成两部分。

  • 只能访问管理员的服务器,其默认数据库指向网络 sqlitedb。
  • 在笔记本电脑上运行的“客户端”,无法访问管理员,其默认数据库指向本地 sqlite 数据库。

您的文件结构可能如下所示:

|-- 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 回答