首页 > 解决方案 > Django在尝试创建对象时抛出“'NoneType'对象不可调用”错误

问题描述

我一直在尝试使用 get_or_create 创建一个“标签”对象。但是,当我这样做时,Django 会抛出“NoneType”对象不可调用”错误。

以下是相关代码块:

def create_segments(self):
        fi = self.fi
        parser = self.parser

        self._get_soup(fi)
        paras = self.soup.find_all("w:p")
        tags = list()

        for para_num, para in enumerate(paras, start=1):
            para_object = self._create_para_object(fi, para_num, para)
            tags.append(self._create_tag_objects(para, para_object, fi)) <<<<<<<<<<<<<< THIS

        sentences = self._get_string_with_tags(paras, tags)

        self._create_segment_objects(sentences, parser, fi)

问题出在tags.append(self._create_tag_objects(para, para_object, fi)). para是 BeautifulSoup 对象,para_object是在问题行上方的一行中创建的 Django Paragraph 对象,并且fi是另一个 Django 对象。

下面是_create_tag_object

    def _create_tag_objects(self, para, para_object, fi):
        tags = self._get_tag_xml(para)
        in_file_id = Tag.objects.filter(paragraph__projectfile=fi).count() + 1
        for tag in tags:
            Tag.objects.get_or_create(
                paragraph=para_object,
                in_file_id=in_file_id + 1,
                tag_wrapper=tag[0]
            )
            in_file_id += 1

        return tags

下面是标签和段落的模型。

class Paragraph(models.Model):
    projectfile = models.ForeignKey(ProjectFile, on_delete=models.CASCADE)
    para_num = models.IntegerField()
    default_wrapper = models.TextField()


class Tag(models.Model):
    paragraph = models.ForeignKey(Paragraph, on_delete=models.CASCADE)
    in_file_id = models.IntegerField()
    tag_wrapper = models.TextField()

以下是完整的追溯。

Environment:


Request Method: POST
Request URL: http://localhost:8000/project/new

Django Version: 3.1.2
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'users',
 'translation',
 'crispy_forms',
 'storages',
 'django_cleanup']
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',
 'whitenoise.middleware.WhiteNoiseMiddleware']



Traceback (most recent call last):
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/contrib/auth/mixins.py", line 52, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/home/daniel/VSCode/master_trans/translation/views.py", line 209, in post
    create_file_and_segments(parser, fi_list, project)
  File "/home/daniel/VSCode/master_trans/translation/seg_creators.py", line 24, in create_file_and_segments
    CreateSegment(fi, parser)
  File "/home/daniel/VSCode/master_trans/translation/seg_creators.py", line 35, in __init__
    creator.create_segments()
  File "/home/daniel/VSCode/master_trans/translation/seg_creators.py", line 174, in create_segments
    tags.append(self._create_tag_objects(para, para_object, fi))
  File "/home/daniel/VSCode/master_trans/translation/seg_creators.py", line 116, in _create_tag_objects
    Tag.objects.get_or_create(
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/query.py", line 573, in get_or_create
    return self.get(**kwargs), False
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/query.py", line 418, in get
    clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/query.py", line 942, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/query.py", line 962, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, *args, **kwargs)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/query.py", line 969, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1358, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1377, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1267, in build_filter
    value = self.resolve_lookup_value(value, can_reuse, allow_joins)
  File "/home/daniel/VSCode/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1063, in resolve_lookup_value
    value = value.resolve_expression(

Exception Type: TypeError at /project/new
Exception Value: 'NoneType' object is not callable

如果有的话,我可以提供更多相关的代码,但我认为上面列出的内容是可以的。预先感谢您提供有用的见解。

标签: pythondjango

解决方案


推荐阅读