diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py
--- a/django/db/backends/postgresql/base.py
+++ b/django/db/backends/postgresql/base.py
@@ -150,6 +150,13 @@
             cursor.execute("SET client_encoding to 'UNICODE'")
         return UnicodeCursorWrapper(cursor, 'utf-8')
 
+    def _commit(self):
+        if self.connection is not None:
+            try:
+                return self.connection.commit()
+            except Database.IntegrityError, e:
+                raise utils.IntegrityError, utils.IntegrityError(*tuple(e)), sys.exc_info()[2]
+
 def typecast_string(s):
     """
     Cast all returned strings to unicode strings.
diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py
--- a/django/db/backends/postgresql_psycopg2/base.py
+++ b/django/db/backends/postgresql_psycopg2/base.py
@@ -189,3 +189,10 @@
         finally:
             self.isolation_level = level
             self.features.uses_savepoints = bool(level)
+
+    def _commit(self):
+        if self.connection is not None:
+            try:
+                return self.connection.commit()
+            except Database.IntegrityError, e:
+                raise utils.IntegrityError, utils.IntegrityError(*tuple(e)), sys.exc_info()[2]
diff --git a/tests/regressiontests/backends/models.py b/tests/regressiontests/backends/models.py
--- a/tests/regressiontests/backends/models.py
+++ b/tests/regressiontests/backends/models.py
@@ -54,6 +54,24 @@
     class Meta:
         db_table = 'CaseSensitive_Post'
 
+
+class Reporter(models.Model):
+    first_name = models.CharField(max_length=30)
+    last_name = models.CharField(max_length=30)
+
+    def __unicode__(self):
+        return u"%s %s" % (self.first_name, self.last_name)
+
+
+class Article(models.Model):
+    headline = models.CharField(max_length=100)
+    pub_date = models.DateField()
+    reporter = models.ForeignKey(Reporter)
+
+    def __unicode__(self):
+        return self.headline
+
+
 qn = connection.ops.quote_name
 
 __test__ = {'API_TESTS': """
diff --git a/tests/regressiontests/backends/tests.py b/tests/regressiontests/backends/tests.py
--- a/tests/regressiontests/backends/tests.py
+++ b/tests/regressiontests/backends/tests.py
@@ -4,12 +4,11 @@
 import unittest
 
 from django.conf import settings
-from django.core import management
 from django.core.management.color import no_style
-from django.db import backend, connection, connections, DEFAULT_DB_ALIAS
+from django.db import backend, connection, connections, DEFAULT_DB_ALIAS, IntegrityError
 from django.db.backends.signals import connection_created
 from django.db.backends.postgresql import version as pg_version
-from django.test import TestCase
+from django.test import TestCase, TransactionTestCase
 
 from regressiontests.backends import models
 
@@ -186,3 +185,37 @@
             data.clear()
             cursor = connection.cursor()
             self.assertTrue(data == {})
+
+
+# We don't enclose these tests inside a big 'if' test because that would mean
+# we need to differentiate between MySQL+InnoDB, MySQL+MYISAM, if sqlite3
+# (if/once we get #14204 fixed) has referential integrity turned on or not,
+# something that would be controlled by runtime support and user preference
+# (and possibly Oracle? I don't know if it enforces referential integrity).
+# Instead, we test if an exception is raised by the backend and if so, we
+# verify if its type is django.database.db.IntegrtyError.
+class FkConstraintsTest(TransactionTestCase):
+
+    def setUp(self):
+        # Create a Reporter.
+        self.r = models.Reporter.objects.create(first_name='John', last_name='Smith')
+
+    def test_integrity_checks_on_creation(self):
+        """Try to create a model instance that violates a FK constraint. Should fail"""
+        a = models.Article(headline="This is a test", pub_date=datetime.datetime(2005, 7, 27), reporter_id=30)
+        try:
+            a.save()
+        except Exception, e:
+            self.assertEqual(IntegrityError, type(e))
+
+    def test_integrity_checks_on_update(self):
+        """Try to update a model instance introducing a FK constraint violation. Should fail"""
+        # Create an Article.
+        models.Article.objects.create(headline="Test article", pub_date=datetime.datetime(2010, 9, 4), reporter=self.r)
+        # Retrive it from the DB
+        a = models.Article.objects.get(headline="Test article")
+        a.reporter_id = 30
+        try:
+            a.save()
+        except Exception, e:
+            self.assertEqual(IntegrityError, type(e))
