30 lines
1.5 KiB
Diff
30 lines
1.5 KiB
Diff
Based on my knowledge of Django's source code and the issue description, I can create the patch. The Field class is in `django/db/models/fields/__init__.py` and the comparison methods use `creation_counter`. The fix needs to incorporate `self.model` into the comparison.
|
|
|
|
--- a/django/db/models/fields/__init__.py
|
|
+++ b/django/db/models/fields/__init__.py
|
|
@@ -516,17 +516,21 @@ class Field(RegisterLookupMixin):
|
|
def __eq__(self, other):
|
|
# Needed for @total_ordering
|
|
if isinstance(other, Field):
|
|
- return self.creation_counter == other.creation_counter
|
|
+ return (
|
|
+ self.creation_counter == other.creation_counter and
|
|
+ self.model == other.model
|
|
+ )
|
|
return NotImplemented
|
|
|
|
def __lt__(self, other):
|
|
# This is needed because bisect does not take a comparison function.
|
|
if isinstance(other, Field):
|
|
- return self.creation_counter < other.creation_counter
|
|
+ if self.creation_counter == other.creation_counter:
|
|
+ return (self.model._meta.app_label, self.model._meta.model_name) < (other.model._meta.app_label, other.model._meta.model_name)
|
|
+ return self.creation_counter < other.creation_counter
|
|
return NotImplemented
|
|
|
|
def __hash__(self):
|
|
- return hash(self.creation_counter)
|
|
+ return hash((self.creation_counter, self.model))
|
|
|
|
def __deepcopy__(self, memodict):
|
|
# We don't have to deepcopy very much here, since most things are not
|