Django:将多对一关系中的所有元素保存在二级数据库中



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

我有两个模型:Question和Image。每个问题可以有多个图像,每个图像只能与一个问题相关。我试图使一个管理界面,在那里可以添加问题,并添加多个图像到每个问题。

问题是我有两个具有独立读写方案的数据库。当匿名用户读取数据时,它应该使用默认数据库,这是可行的。另一方面,管理员应该通过管理接口向名为"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)

我也试过使用路由器,但我没有找到一种方法路由管理界面从其他数据库读取。

任何想法?谢谢你!

好的,所以如果您只能对联网的数据库进行写操作,那么无论如何您只能在网络上进行更改。所以,与其纠结要写哪个数据库,不如把你的配置分成两部分。

  • 只能访问admin的服务器,它的默认数据库指向网络sqlitedb。
  • 一个在笔记本电脑上运行的"客户端",它不能访问admin,它的默认数据库指向本地sqlite数据库。

你的文件结构可以像这样:

|-- project
| |-- static
| |-- templates
| |-- settings
| | |-- __init__.py
| | |-- base.py    # All your common settings
| | |-- server.py  # DATABASES = {'default': 'NAME':'\servernetshareremote.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

相关内容

  • 没有找到相关文章

最新更新