【问题标题】:How to store Array in MongoDB using Django MongoEngine如何使用 Django MongoEngine 在 MongoDB 中存储数组
【发布时间】:2021-05-11 09:01:31
【问题描述】:

我正在使用 mongoengine 在 django 和 mongodb 中创建一个测验应用程序。在多项选择模型中。我需要一个变量数组来存储每个问题的所有选择。我是一个初学者,所以需要一点帮助。代码如下:

class multichoice(Document):
    m_title = fields.StringField(primary_key=True, max_length=255, verbose_name='Title')
    m_question = fields.StringField(verbose_name='Question')
    m_question_number = fields.StringField(max_length=255, verbose_name='Question Number')
    m_alternatives = fields.StringField(verbose_name='Alternatives')

要求的结果

{
    "_id": "Which one is the German car company",
    "m_alternatives": ["Honda", "BMW"],
    "m_question": "Which one is the German car company",
    "m_question_number": "2"
}
{
    "_id": "world most valuable company is:",
    "m_alternatives": ["Google", "Microsoft", "Amazon", "Facebook", "Coca-Cola", "Disney", "Leisure", "Samsung", "Louis Vuitton", "McDonald's", "Apple"],
    "m_question": "world most valuable company is:",
    "m_question_number": "3"
}

编辑 1

class multichoice(Document):
    m_title = fields.StringField(primary_key=True, max_length=255, verbose_name='Title')
    m_question = fields.StringField(verbose_name='Question')
    m_question_number = fields.StringField(max_length=255, verbose_name='Question Number')
    m_alternatives = fields.ListField(fields.StringField(),verbose_name='Alternatives')

错误(Only lists and tuples may be used in a list field: ['m_alternatives'])
完整的回溯

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/content_admin/mcqs/multichoice/add/

Django Version: 3.0.5
Python Version: 3.9.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django_mongoengine',
 'django_mongoengine.mongo_auth',
 'django_mongoengine.mongo_admin',
 'mcqs']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\contrib\admin\options.py", line 607, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\contrib\admin\sites.py", line 231, in inner
    return view(request, *args, **kwargs)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\contrib\admin\options.py", line 1638, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Program Files\Python39\lib\site-packages\django_mongoengine\mongo_admin\options.py", line 317, in changeform_view
    self.save_model(request, new_object, form, not add)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\django\contrib\admin\options.py", line 1081, in save_model
    obj.save()
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\mongoengine\document.py", line 387, in save
    self.validate(clean=clean)
  File "C:\Users\Ali Abdullah\AppData\Roaming\Python\Python39\site-packages\mongoengine\base\document.py", line 432, in validate
    raise ValidationError(message, errors=errors)

Exception Type: ValidationError at /content_admin/mcqs/multichoice/add/
Exception Value: ValidationError (multichoice:Capital of India is:) (Only lists and tuples may be used in a list field: ['m_alternatives'])

编辑 2

from django_mongoengine import mongo_admin as admin
from mcqs.models import *

# Register your models here.
class multichoice_admin(admin.DocumentAdmin):
    model = multichoice
    fields = ('m_question', 'm_alternatives', 'm_title', 'm_question_number', )


admin.site.register(multichoice, multichoice_admin)

【问题讨论】:

    标签: python django mongoengine


    【解决方案1】:

    您可以将 ListField 用于 mongoengine。检查here

    【讨论】:

    • 我正在使用 mongoengine
    • @Aly 抱歉,没注意到。我更新了我的答案,希望对您有所帮助。
    • 保存时遇到此错误(Only lists and tuples may be used in a list field: ['m_alternatives'])。我更新了我的代码。
    • 你能分享你试图保存的数据吗?看起来像是类型错误。
    • Title: Capital of India is: Alternatives: ['Mumbai','Pune','New Delhi'] Question: Capital of India is: Question Number 4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    相关资源
    最近更新 更多