Djongo数据库引擎上的Django Admin外键错误
Posted
技术标签:
【中文标题】Djongo数据库引擎上的Django Admin外键错误【英文标题】:Django Admin Foreign Key Error on Djongo database engine 【发布时间】:2021-07-03 04:01:44 【问题描述】:我正在使用djongo 包作为数据库后端引擎,以便连接到 MongoDB 并在其上定义我的模型。
settings.py:
DATABASES =
# 'default':
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': str(BASE_DIR / 'db.sqlite3'),
# ,
'default':
'ENGINE': 'djongo',
'NAME': 'djongo-db',
'ENFORCE_SCHEMA': False,
'CLIENT':
'host': 'localhost',
'port': 27017,
'username': 'root',
'password': 'root',
'authSource': 'admin',
'authMechanism': 'SCRAM-SHA-1'
models.py:
class EventModel(BaseModel)
name = models.CharField(max_length=20)
class CalendarModel(BaseModel):
name = models.CharField(max_length=20)
color = models.CharField(max_length=20)
event = models.ForeignKey(to=EventModel, on_delete=models.SET_NULL, null=True)
和 admin.py:
from django.contrib import admin
from .models import CalendarModel, EventModel
@admin.register(CalendarModel)
class CalendarAdmin(admin.ModelAdmin):
exclude = ['_id']
@admin.register(EventModel)
class EventAdmin(admin.ModelAdmin):
exclude = ['_id']
使用 SQLite 后端可以正常工作,并且当 djongo 后端没有外键字段时它可以正常工作,但是在使用 djongo 后端 并且有外键字段时给我一个错误。它说:
如上图所示,它可以从数据库中加载对象并正确检测关系,但无法保存。
而且我无法创建与另一个对象相关的新对象。 我该如何解决这个问题?
更新
我可以使用这样的代码创建对象,问题似乎来自 Django 管理站点
e = EventModel.objects.first()
CalendarModel.objects.create(name="test", color="red", event=e)
【问题讨论】:
将blank=True
放入事件字段..
@Pradip 我这样做了,但该错误仍然存在:(
【参考方案1】:
我注意到,当您尝试使用 PK an ObjectId 保存对象的实例时,它会转换为 string,因此不再对应于一个对象,因此通过在 POST 中重写 get_form 方法,您可以截取此数据并将 字符串更改为 ObjectId,但您可以见Django documentation:
request.POST 和 request.GET 中的 QueryDicts 将是不可变的 在正常的请求/响应周期中访问。
因此您可以使用同一文档中的建议:
要获得可变版本,您需要使用 QueryDict.copy()
或者...使用一个小技巧,例如,如果您出于某种原因需要保留对对象的引用或保持对象不变:
# remember old state
_mutable = data._mutable
# set to mutable
data._mutable = True
# сhange the values you want
data['param_name'] = 'new value'
# set mutable flag back
data._mutable = _mutable
你的 QueryDicts
数据在哪里在这种情况下:
@admin.register(CalendarModel)
class CalendarModelAdmin(admin.ModelAdmin):
list_display = ('....')
....
def get_form(self, request, obj, change, **kwargs):
if request.POST:
# remember old state
_mutable = request.POST._mutable
# set to mutable
request.POST._mutable = True
# сhange the values you want
request.POST['event'] = ObjectId(request.POST['event'])
# set mutable flag back
request.POST._mutable = _mutable
return super().get_form(request, obj=obj, change=change, **kwargs)
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 帖子已编辑并附有说明以上是关于Djongo数据库引擎上的Django Admin外键错误的主要内容,如果未能解决你的问题,请参考以下文章
Django - 无法使用两个数据库进行测试(带有 gis 扩展的 postgres 和 mongoDB (Djongo)
尝试重置密码时出现 Djongo + Django + MongoDB Atlas DatabaseError
Django 与 Djongo,EmbeddedFields 返回模型尚未加载