【问题标题】:Django Admin Foreign Key Error on Djongo database engineDjongo数据库引擎上的Django Admin外键错误
【发布时间】: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 我这样做了,但该错误仍然存​​在:(

标签: django mongodb orm djongo


【解决方案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
  • 帖子已编辑并附有说明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 2015-03-17
  • 2016-04-25
  • 2014-10-22
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多