2015-03-26 2 views
0

Это то, что мой models.py выглядит следующим образом:Как решить странное исключение Джанго ограничения уникальности

class Project(models.Model): 
    name = models.CharField(max_length="40", unique=True) 

class Entry(models.Model): 
    project = models.ForeignKey(Project) 
    name = models.CharField(max_length="40",unique=False) 

Когда я хочу, чтобы создать новую запись я хотел бы использовать Ajax, чтобы опубликовать имя записи на сервер

И это createEntry, который заботится о запросе Ajax пост

def createEntry(request):  
    if request.method == 'POST': 
     response_data = {}  
     name = request.POST.get('name') 
     projectId = request.session['projectId'] 
     try: 
      project = Project.objects.get(pk=projectId) 
      entry=Entry(name=name)   
      project.entry_set.add(entry) 
     except: 
      print traceback.format_exc() 
      return HttpResponseBadRequest("Failed") 
    response_data['result'] = 'Create post successful!' 

    return JsonResponse(response_data) 

Everythin г плавно переходит вправо, за исключением того, когда новая запись с таким же именем уже существующим, создается исключение происходит

Вот информация отслеживающего

Traceback (most recent call last): 
    File "/home/vagrant/src/src/views.py", line 70, in createEntry 
    project.entry_set.add(entry) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py", line 708, in add 
    obj.save() 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 589, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/usr/local/lib/python2.7/dist-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 "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 698, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 731, in _do_insert 
    using=using, raw=raw) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 92, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 921, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 920, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 81, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.py", line 485, in execute 
    return Database.Cursor.execute(self, query, params) 
IntegrityError: UNIQUE constraint failed: src_entry.name 

Вот идет мой вопрос:

Так как Я явно определяю поле имени Entry с unique = False, не должно быть уникального ограничения на поле имени, тогда как могло произойти это исключение?

+0

У вас изначально было уникальное значение = True, а затем изменить его? Если это так, вам нужно создать и запустить миграцию. –

+0

Было ли это уникальным раньше? Вы перенесли свою базу данных после ее изменения? – Selcuk

+0

У меня есть миграция после изменения уникального значения False, но он говорит: «Не обнаружено изменений». –

ответ

0

Это ограничение UNIQUE выполняется в базе данных. Вам нужно будет выполнить миграцию, чтобы удалить ограничение.

0

Проверьте, нет ли проблем с миграцией базы данных. Вот возможные действия, которые вы можете сделать, если используете одну из баз данных postgresql или sqlite, которая встроена в базу данных django.

1.sqlite: - просто удалить контейнер базы данных SQLite в ваших рамках Джанго и выполнить следующие действия

$python manage.py makemigrations 
$python manage.py migrate 
$python manage.py runserver 

2.postgresql: - Вам нужно удалить базу данных с помощью следующих шагов

$sudo -u postgres psql 
postgresql#drop database YOUR_DATABASE_NAME 
postgresql#create database NEW_DATABASE_NAME 
postgresql#grant all privileges on database "NEW_DATABASE_NAME" to YOUR_USER_NAME 

$python manage.py makemigrations 
$python manage.py migrate 
$python manage.py createsuperuser 
$python manage.py runserver 
Смежные вопросы