#17466 closed Bug (duplicate)
Model __eq__ does not compare correctly between normal objects and deferred objects
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | Uncategorized | Version: | 1.3 |
| Severity: | Normal | Keywords: | |
| Cc: | Enrico, Zini, <enrico@…>, marti@… | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Enrico Zini <enrico@…> found a problem and reported it to the Debian Bug Tracking System: http://bugs.debian.org/653177
I'll paste his report below:
I noticed that there is a problem with the default model object __eq__
implementation when working with deferred objects.
The default implementation should be something like:
def __eq__(self, other):
return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_
val()
Now, given a simple model...
class Package(models.Model):
name = models.TextField(null=False, unique=True)
# Lots of other fields
...this code will show the problem:
# Get a normal object
p = Package.objects.get(name="debtags")
# Get a deferred object
dp = Package.objects.filter(name="debtags").only("name")[0]
print object.__repr__(p), hash(p)
print object.__repr__(dp), hash(dp)
# This assert succeeds
assert hash(p) == hash(dp)
# This assert fails
assert p == dp
Its output is:
<Package: debtags> 11
<Package_Deferred_ldesc_popcon_sdesc_source_version: debtags> 11
It looks like the isinstance bit of the default __eq__ model is failing
here.
This causes suprising behaviour:
allpkgs = set(Package.objects.all().only("name"))
# This assert fails
assert Package.objects.get(name="debtags") in allpkgs
Change History (2)
comment:1 by , 14 years ago
| Resolution: | → duplicate |
|---|---|
| Status: | new → closed |
comment:2 by , 13 years ago
| Cc: | added |
|---|
Note:
See TracTickets
for help on using tickets.
This looks to be the same problem as described in #11892.