Django 检查查询集是否为空

Django 检查查询集是否为空,django,Django,我想确认这是否是检查空queryset的正确方法,以及这是否是我出现唯一约束错误的原因 syn_check= Synonym.objects.filter(MD.objects.get(**filter_dict), synonym_type=Stype.objects.filter(description=values.capitalize().strip()), synonym_name=key) if not syn_check: print 'unavailable synony

我想确认这是否是检查空queryset的正确方法,以及这是否是我出现唯一约束错误的原因

syn_check= Synonym.objects.filter(MD.objects.get(**filter_dict), synonym_type=Stype.objects.filter(description=values.capitalize().strip()), synonym_name=key)
if not syn_check:
    print 'unavailable synonym', key, values
    syn = Synonym()
    syn.synonym_type=Stype.objects.filter(description=values.capitalize().strip()
    syn.synonym_name = key.strip()
    syn.save()
我在做什么奇怪的事吗?我还使用了
if not syn_check.count()
,我也遇到了同样的问题

以下是回溯:

    Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/home/project/PycharmProjects/project/project/management/commands/back_populate_data.py", line 53, in handle
    loaded_syn = data_loaded_syn4_pubchem(synonym_decoded, filter_dict)
  File "/home/project/PycharmProjects/project/project/lookup_data.py", line 203, in data_loaded_syn4_pubchem
    mol_syn_ob.save()
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/base.py", line 589, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/base.py", line 617, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/base.py", line 698, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/base.py", line 731, in _do_insert
    using=using, raw=raw)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/query.py", line 921, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 921, in execute_sql
    cursor.execute(sql, params)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 81, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/home/project/.virtualenvs/project/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 485, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: project_synonym.molecule_id, project_synonym.synonym_name, project_synonym.synonym_type_id
回溯(最近一次呼叫最后一次):
文件“manage.py”,第10行,在
从命令行(sys.argv)执行命令
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/core/management/_init__.py”,第385行,从命令行执行
utility.execute()
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/core/management/_init__.py”,第377行,执行
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/core/management/base.py”,第288行,在运行中,来自
self.execute(*args,**选项._dict__;
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/core/management/base.py”,第338行,在execute中
输出=self.handle(*args,**选项)
文件“/home/project/PycharmProjects/project/project/management/commands/back\u populate\u data.py”,第53行,在handle中
加载的syn=数据加载的syn4\U pubchem(同义词解码、过滤)
文件“/home/project/PycharmProjects/project/project/lookup_data.py”,第203行,在data_loaded_syn4_pubchem中
mol_syn_ob.save()文件
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/models/base.py”,第589行,保存
强制更新=强制更新,更新字段=更新字段)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/models/base.py”,第617行,在save_base中
更新=自我。保存表格(原始、cls、强制插入、强制更新、使用、更新字段)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/models/base.py”,第698行,在保存表格中
结果=self.\u do\u insert(cls.\u base\u manager,using,fields,update\u pk,raw)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/models/base.py”,第731行,插入
使用=使用,原始=原始)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/models/manager.py”,第92行,在manager\u方法中
返回getattr(self.get_queryset(),name)(*args,**kwargs)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/models/query.py”,第921行,插入
return query.get\u编译器(using=using).execute\u sql(return\u id)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/models/sql/compiler.py”,第921行,在execute\u sql中
cursor.execute(sql,params)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/backends/utils.py”,执行中第81行
返回super(CursorDebugWrapper,self).execute(sql,params)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/backends/utils.py”,执行中第65行
返回self.cursor.execute(sql,params)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/utils.py”,第94行,在退出时__
6.重新播放(dj_exc_类型、dj_exc_值、回溯)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/backends/utils.py”,执行中第65行
返回self.cursor.execute(sql,params)
文件“/home/project/.virtualenvs/project/local/lib/python2.7/site packages/django/db/backends/sqlite3/base.py”,第485行,执行
返回Database.Cursor.execute(self、query、params)
django.db.utils.IntegrityError:唯一约束失败:项目\u同义词.molecular\u id,项目\u同义词.synonym\u名称,项目\u同义词.synonym\u类型\u id

感谢您在进行检查时检查查询集,这很好

if not syn_check:
但是,它并没有它可能的那么有效,您正在从数据库加载所有对象,而您只想知道queryset是否为空

最好使用
count()

使用
exists()

代码中的问题是在哪里定义查询集

syn_check = Synonym.objects.filter(MD.objects.get(**filter_dict), synonym_type=Stype.objects.filter(description=values.capitalize().strip()), synonym_name=key)

filter()
方法接受参数或。将模型实例作为位置参数从
MD.objects.get(…)
传递是没有意义的。

执行
Synonym.objects.filter(MD.objects.filter())
看起来是错误的,您不应该将queryset作为参数传递给filter。你想在那里做什么,以及
MD
同义词的关系如何?实际检查
如果不同步检查:
正常。但是,
.count()
效率更高,
.exists()
甚至更好,因为您不需要访问queryset中的对象。MD是MD的父表,同义词是MD的相关表。它解决了代码其他部分的问题。我不知道为什么这是一个问题。我很确定这也是代码其他地方的一个bug,即使它没有抛出错误。
filter()
方法将作为参数,或。将queryset作为参数传递是没有意义的,我仍然不确定您要在那里执行什么操作。我将其带上并重新定义为
syn\u check=Synonym.objects.filter(mol=id,Synonym\u type=syn\u type,Synonym\u name=key)
。很好,谢谢,很好!我在下面添加了我的评论作为回答。
if not syn_check.exists():
syn_check = Synonym.objects.filter(MD.objects.get(**filter_dict), synonym_type=Stype.objects.filter(description=values.capitalize().strip()), synonym_name=key)