This is what my models.py looks like:
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)
When I want to create a new entry I would use ajax to post the name of the entry to the server
And it's the createEntry which takes care of the ajax post request
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)
Everything goes smoothly right except that when a new entry with a same name of a existing one is being created an exception happens
Here is the traceback info
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
Here goes my question:
Since I have explicitly define the name field of the Entry with unique=False , there shouldn't be unique constraint on the name field, then how could this exception happen?
This UNIQUE constraint is being enforced by the database. You will need to run a migration to remove the constraint.
check to see if there is any problem with database migrations. Here are the possible actions you can do if you are using one of the databases postgresql or sqlite which comes built-in with django database.
1.sqlite:- simply delete the sqlite database container in your django framework and perform the following actions
$python manage.py makemigrations
$python manage.py migrate
$python manage.py runserver
2.postgresql :- You need to drop the database by the following steps
$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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.