【问题标题】:Mongoengine with django: DuplicateKeyError [duplicate]Mongoengine 与 django:DuplicateKeyError [重复]
【发布时间】:2018-02-23 22:48:11
【问题描述】:

我在 Django 项目中使用 mongoengine (http://mongoengine.org/)。我不知道这是否是一个好主意,但我想我只是试着让它工作,因为似乎没有针对 Django 的最新 MongoDB 实现。运行我的服务器并尝试访问 localhost:8000/workoutcal/ 时出现此错误:

Traceback (most recent call last):
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/workout/workoutcal/views.py", line 18, in calendar
    workouts_in_month = Workout.objects(Q(date__gte=datetime(year=today_year, month=today_month, day=today_day)) & Q(date__lt=datetime(year=today_year, month=today_month+1, day=1)))
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/mongoengine/queryset/manager.py", line 37, in __get__
    queryset = queryset_class(owner, owner._get_collection())
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/mongoengine/document.py", line 204, in _get_collection
    cls.ensure_indexes()
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/mongoengine/document.py", line 834, in ensure_indexes
    collection.create_index(fields, background=background, **opts)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/pymongo/collection.py", line 1571, in create_index
    self.__create_index(keys, kwargs)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/pymongo/collection.py", line 1472, in __create_index
    parse_write_concern_error=True)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/pymongo/collection.py", line 232, in _command
    collation=collation)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/pymongo/pool.py", line 477, in command
    collation=collation)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/pymongo/network.py", line 116, in command
    parse_write_concern_error=parse_write_concern_error)
  File "/Users/sahandzarrinkoub/Documents/Programming/Web/Django/workout/lib/python3.6/site-packages/pymongo/helpers.py", line 203, in _check_command_response
    raise DuplicateKeyError(errmsg, code, response)
pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: db.workout index: id_1 dup key: { : null }

我无法理解这个错误。这是否意味着锻炼文档有重复的键?这听起来很奇怪,因为这就是我的 workoutcal/models.py 的样子:

from mongoengine import *

class Person(Document):
    name = StringField(max_length = 200)
    person_id = IntField(unique = True)
    def __str__(self):
        return str(self.person_id) + self.name

class Lift(EmbeddedDocument):
    lift_id = IntField(unique=True)
    name = StringField(max_length=200) #e.g. bench press, etc
    sets = ListField(IntField()) # No of reps in each set
    def __str__(self):
        return self.name

class Cardio(EmbeddedDocument):
    cardio_id = IntField(unique=True)
    name = StringField(max_length=200)
    duration = IntField() #Number of minutes
    distance = IntField() #Number of metres
    def __str__(self):
        return self.name

class Workout(Document):
    id = IntField(unique=True)
    date = DateTimeField()
    person = ReferenceField(Person)
    lifts = ListField(EmbeddedDocumentField(Lift))
    cardio = ListField(EmbeddedDocumentField(Cardio))
    def __str__(self):
        return str(self.date)+" "+self.person.name

其他可能有用的信息:

我不知道在哪里做connect('db')(连接到我电脑上的mongod数据库)所以我把它放在我的settings.py中:

from mongoengine import connect
...
connect('db') # <---
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # I kept this since it's needed for admin, etc.
        'NAME': 'mydatabase',
    }
}

workoutcal/urls.py:

app_name = 'workoutcal'
urlpatterns = [
    url(r'^$', views.calendar, name = 'calendar'),
    url(r'^(?P<id>[0-9]+)/$', views.detail, name = 'detail'), #Detail of a workout. Shows lifts, duration, etc. All the attributes.
    url(r'^add/(?P<year>[0-9]+)/(?P<month>[0-9]+)/(?P<day>[0-9]+)/$', views.add, name = 'add'), #Adding a workout for the date in question
    url(r'^edit/(?P<id>[0-9]+)/$', views.edit, name = 'edit'), #Editing an existing workout. id is id of workout object to edit.
]

简而言之,我的问题是:

  1. 为什么会出现此错误,我该怎么办?
  2. 在我的 Django 项目中,connect()mongod 的正确内容是什么?
  3. 您对以这种方式将 mongoenging 与 django 集成的想法?

【问题讨论】:

    标签: python django mongodb pymongo


    【解决方案1】:

    duplicate key error collection: db.workout index: id_1 dup key: { : null } 在 mongo 中表示您已经使用 id = null 存储了一个锻炼实体,现在正尝试使用 id = null 存储另一个锻炼实体。您将不得不手动清理数据库。之后,看看

    class Workout(Document):
        id = IntField(unique=True)
    

    id 不是必需的,所以我想您在将实体保存到数据库时没有设置它。在 id 字段参数中添加null=False 以确保其已初始化。或者更好的是,根本没有 id 字段,让 django 为您自动创建一个 - 但不确定如何使用 mongo。

    【讨论】:

    • 感谢您的回答。一个问题:你说我应该手动清理数据库我假设你的意思是用id=null清理db.workout(一个集合)中的文档。问题是:我在检查集合时得到这个输出:&gt; db.workout.find() { "_id" : ObjectId("59ba9a56aba92f063ee577af"), "date" : ISODate("2017-09-14T14:58:02.984Z"), "person" : ObjectId("59ba9a4daba92f063ee577ae"), "lifts" : [ { "name" : "bench press", "sets" : [ 3, 4 ] }, { "name" : "squat", "sets" : [ 3, 4 ] } ], "cardio" : [ { "name" : "running", "duration" : 10, "distance" : 800 } ] }
    • 然后是另外 3 个看起来类似的文档。有趣的是,他们都没有"_id" : null。如果没有文档有id=null,怎么会有重复的key null?
    • 嗯,然后试试recreating the indexes
    • 我运行了db.workout.reIndex(),虽然它解决了这个错误,但它创建了另一个错误:mongoengine.errors.FieldDoesNotExist: The fields "{'_id'}" do not exist on the document "Workout"。这是什么意思?
    • 实际上,在重新托管服务器后,原来的错误又回来了......
    猜你喜欢
    • 1970-01-01
    • 2020-11-06
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多