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.POSTrequest.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连接器

尝试重置密码时出现 Djongo + Django + MongoDB Atlas DatabaseError

Django 与 Djongo,EmbeddedFields 返回模型尚未加载

djongo,无法连接到 cloud.mongodb.com 上的远程数据库

Djongo