【问题标题】:Djongo ArrayField 'Item' is not subscriptableDjango 数组字段“项目”不可下标
【发布时间】:2020-11-22 03:53:36
【问题描述】:

我的 django 项目中有 2 个模型。 DB 是 mongoDB,我用的是 Djongo。

以下是模型:

class Item(models.Model):
    item_id = models.IntegerField(primary_key=True)
    item_name = models.CharField(max_length=30)

    def __str__(self):
        return f'<{self.item_name}>'


class Items(models.Model):
    items_id = models.IntegerField(primary_key=True)
    inventory = models.ArrayField(model_container=Item,)
    neutral_item = models.EmbeddedField(model_container=Item,)
    buffs = models.ArrayField(model_container=Item,)

    def __str__(self):
        return f'<{self.inventory}, {self.neutral_item}>'

当我这样做时:

item = Item(item_name='Helmet')
items = Items(inventory=[item])

我收到这个类型错误:

'Item' object is not subscriptable

怎么了?

整个错误信息:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/base.py", line 745, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/base.py", line 782, in save_base
    updated = self._save_table(
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/base.py", line 887, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/base.py", line 924, in _do_insert
    return manager._insert(
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/query.py", line 1204, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1390, in execute_sql
    for sql, params in self.as_sql():
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1333, in as_sql
    value_rows = [
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1334, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1334, in <listcomp>
    [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1275, in prepare_value
    value = field.get_db_prep_save(value, connection=self.connection)
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/djongo/models/fields.py", line 215, in get_db_prep_save
    return self.get_prep_value(value)
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/djongo/models/fields.py", line 222, in get_prep_value
    processed_value = self._value_thru_fields('get_prep_value',
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/djongo/models/fields.py", line 315, in _value_thru_fields
    post_dict = super()._value_thru_fields(func_name,
  File "/Users/georgii/PycharmProjects/custom_hero_chaos/venv/lib/python3.8/site-packages/djongo/models/fields.py", line 145, in _value_thru_fields
    field_value = value[field.attname]
TypeError: 'Item' object is not subscriptable

【问题讨论】:

  • 你能发布整个错误信息吗?想知道它发生在哪里。
  • 请在上面找到,编辑问题
  • 需要明确的是,当您运行 item = Item(item_name...) 时。您是尝试在数据库中创建该实例还是获取它?
  • 我想稍后保存()它
  • 您是否让它与我在下面的回复一起使用?

标签: django mongodb model djongo


【解决方案1】:

根据Djongo docs for ArrayField,您应该像这样实例化:

entry = Entry()
entry.authors = [{'name': 'John', 'email': 'john@mail.com'},
                {'name': 'Paul', 'email': 'paul@mail.com'}]
entry.save()

所以在你的情况下,你会这样做。

items = Items()
items.inventory = [
    {'item_name': 'Helmet'}
]
items.save()

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 2016-06-30
    • 2016-12-16
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2020-02-20
    • 2018-08-15
    相关资源
    最近更新 更多