Index: django/db/models/base.py
===================================================================
--- django/db/models/base.py	(revision 11231)
+++ django/db/models/base.py	(working copy)
@@ -273,7 +273,15 @@
         # Now we're left with the unprocessed fields that *must* come from
         # keywords, or default.
 
+        # In the case of diamond inheritance, where B and C inherit from A, and
+        # D inherits from B and C, D will have "redundant" copies of each of
+        # A's fields. As we iterate through all the fields, the second time we
+        # see a field we run the risk of reassigning it the default value, so
+        # if a field has already been seen in assigned_fields, we ignore it.
+        assigned_fields = set()
         for field in fields_iter:
+            if field.attname in assigned_fields:
+                continue
             is_related_object = False
             # This slightly odd construct is so that we can access any
             # data-descriptor object (DeferredAttribute) without triggering its
@@ -311,6 +319,7 @@
                 setattr(self, field.name, rel_obj)
             else:
                 setattr(self, field.attname, val)
+            assigned_fields.add(field.attname)
 
         if kwargs:
             for prop in kwargs.keys():
Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 11231)
+++ django/forms/models.py	(working copy)
@@ -793,15 +793,11 @@
     from django.db.models import ForeignKey
     opts = model._meta
     if fk_name:
-        fks_to_parent = [f for f in opts.fields if f.name == fk_name]
-        if len(fks_to_parent) == 1:
-            fk = fks_to_parent[0]
-            if not isinstance(fk, ForeignKey) or \
-                    (fk.rel.to != parent_model and
-                     fk.rel.to not in parent_model._meta.get_parent_list()):
-                raise Exception("fk_name '%s' is not a ForeignKey to %s" % (fk_name, parent_model))
-        elif len(fks_to_parent) == 0:
-            raise Exception("%s has no field named '%s'" % (model, fk_name))
+        fk = opts.get_field(fk_name,many_to_many=False)
+        if not isinstance(fk, ForeignKey) or \
+                (fk.rel.to != parent_model and
+                 fk.rel.to not in parent_model._meta.get_parent_list()):
+            raise Exception("fk_name '%s' is not a ForeignKey to %s" % (fk_name, parent_model))
     else:
         # Try to discover what the ForeignKey from model to parent_model is
         fks_to_parent = [
Index: tests/modeltests/model_inheritance/models.py
===================================================================
--- tests/modeltests/model_inheritance/models.py	(revision 11231)
+++ tests/modeltests/model_inheritance/models.py	(working copy)
@@ -116,6 +116,26 @@
     def __unicode__(self):
         return u"%s the parking lot" % self.name
 
+#
+# Diamond inheritance test
+# 
+
+class Owner(models.Model):
+    name = models.CharField(max_length=255)
+    
+class FoodPlace(models.Model):
+    name = models.CharField(max_length=255)
+    owner = models.ForeignKey(Owner,blank=True,null=True)
+
+class Bar(FoodPlace):
+    pass
+
+class Pizzeria(FoodPlace):
+    pass
+
+class PizzeriaBar(Bar, Pizzeria):
+    pizza_bar_specific_field = models.CharField(max_length=255)
+
 __test__ = {'API_TESTS':"""
 # The Student and Worker models both have 'name' and 'age' fields on them and
 # inherit the __unicode__() method, just as with normal Python subclassing.
@@ -310,4 +330,37 @@
 3
 >>> settings.DEBUG = False
 
+# Test of diamond inheritance __init__. If B and C inherit from A, and D inherits from B and C, we should be able to use __init__ for D to properly set all the fields, regardless of the redundant copies of A's fields that D inherits from B and C.
+
+>>> p = PizzeriaBar(name="Mike's", pizza_bar_specific_field="Doodle")
+>>> p.name == "Mike's"
+True
+>>> p.pizza_bar_specific_field == "Doodle"
+True
+
+#Note that patch 10808.diff fixes only one symptom, not the real problem. 
+#The real problem is that in case of diamond inheritance there are duplicate field definitions:
+
+  >>> print ' '.join([f.name for f in p._meta.fields])
+  id name owner foodplace_ptr id name owner foodplace_ptr pizzeria_ptr bar_ptr pizza_bar_specific_field
+  
+#The first 4 fields occur twice.
+#My patch won't fix the real problem, but another symptom.
+#When the top-level model of your diamond structure contains a ForeignKey, then you get problems when trying to create inline formsets:
+
+  >>> from django.forms.models import inlineformset_factory
+  >>> f = inlineformset_factory(Owner,PizzeriaBar)
+  Traceback (most recent call last):
+    ...
+  Exception: <class '...PizzeriaBar'> has more than 1 ForeignKey to <class '....Owner'>
+  
+#The workaround I suggest for this problem is to specify the fk_name explicitly:
+
+  >>> from django.forms.models import inlineformset_factory
+  >>> f = inlineformset_factory(Owner,PizzeriaBar,fk_name='owner')
+  
+#Unfortunately this workaround needs another patch 10808b.diff because inlineformset_factory() just can't imagine that a model can have two fields with the same name.
+
+
+
 """}
