2015-11-04 6 views
1

Я хочу подтвердить, что это правильный способ проверить пустой запрос, и если это причина, у меня есть ошибка ограничения UNIQUE.Проверка пустого запроса

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 

Благодаря

+0

Выполнение 'Synonym.objects.filter (MD.objects.filter())' выглядит неправильно, вы не должны передавать запрос в качестве аргумента для фильтрации. Что вы пытаетесь сделать там, и как «MD» относится к «Синониму»? Фактическая проверка 'if not syn_check:' в порядке. Однако '.count()' будет более эффективным и '.exists()' еще лучше, так как вам не нужно обращаться к объектам в наборе запросов. – Alasdair

+0

MD - родительская таблица, а синоним - связанная таблица MD. Он работал с проблемой в другой части кода. Я не знаю, почему это проблема. – djpy

+0

Я уверен, что это ошибка в других местах вашего кода, даже если это не ошибка. Метод 'filter()' принимает [объекты Q] (https://docs.djangoproject.com/en/1.8/topics/db/queries/#complex-lookups-with-q-objects) в качестве аргументов или [ключевое слово аргументы] (https://docs.djangoproject.com/en/1.8/topics/db/queries/#retrieving-specific-objects-with-filters). Не имеет смысла передавать запрос в качестве аргумента, и я все еще не уверен, что вы пытаетесь сделать там. – Alasdair

ответ

1

Проверка QuerySet, как вы делаете это хорошо.

if not syn_check: 

Однако, это не так ЭФФЕКТИВНЫЙ, как это может быть, вы загружаете все объекты из базы данных, когда все, что вы хотите знать, является ли пуст или не QuerySet.

Было бы лучше использовать count(),

if not syn_check.count(): 

и даже лучше использовать exists()

if not syn_check.exists(): 

Проблема в коде, где вы определяете QuerySet

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

Метод filter() принимает либо Q objects как args, или keyword arguments. Не имеет смысла передавать экземпляр модели из MD.objects.get(...) в качестве позиционного аргумента.