Django:将多对一关系中的所有元素保存到辅助数据库中

Django:将多对一关系中的所有元素保存到辅助数据库中,django,foreign-keys,many-to-one,multiple-databases,modeladmin,Django,Foreign Keys,Many To One,Multiple Databases,Modeladmin,我是Django的新手(使用1.5.1版),一直在努力解决这个问题 我有两个模型:问题和图像。每个问题可以有许多图像,每个图像只能与一个问题相关。我正在尝试制作一个管理界面,在这里可以添加问题,并为每个问题添加多个图像 问题是,我有两个数据库,它们具有独立的读写模式。当一个匿名用户读取数据时,它应该使用默认数据库,这是有效的。另一方面,管理员应通过管理员接口将数据读写到名为“remote”的辅助数据库。原因太复杂,无法解释 无论如何,我需要将问题和图像保存到“远程”数据库。问题可以很好地保存在那

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

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

问题是,我有两个数据库,它们具有独立的读写模式。当一个匿名用户读取数据时,它应该使用默认数据库,这是有效的。另一方面,管理员应通过管理员接口将数据读写到名为“remote”的辅助数据库。原因太复杂,无法解释

无论如何,我需要将问题和图像保存到“远程”数据库。问题可以很好地保存在那里,但由于某些原因,图像会保存到默认数据库中。我认为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)
我也尝试使用路由器,但我没有找到一种方法来路由管理接口从其他数据库读取


有什么想法吗?谢谢大家!

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

  • 只能访问管理员的服务器,其默认数据库指向网络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

这似乎是个问题。你到底为什么要为这样一个简单的应用程序设置远程数据库?因为这是一个离线应用程序,需要通过网络硬盘在多个用户之间共享SQLite db,但也需要在没有网络连接的情况下使用(用于查询)。每年有几次将写入集中到一个位置,然后将数据库复制到每个笔记本电脑上进行本地查询。是的,不是最标准的架构,但是需求本身就够奇怪的了。啊,我没有这样想。可能是因为我没有想到我可以使用两种不同的设置。这看起来是最好的选择,谢谢托马斯!我现在就去试试。