Package: python-django
Version: 1.3.1-3
Severity: normal
Hello,
thank you for packaging django.
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
I'll now work around this by implementing my own version of __eq__
methods in my model objects. Something like this works:
def __eq__(self, other):
return self.name == other.name
although I'll have to pay attention not to end up with code that
compares Packages with something else.
Ciao,
Enrico
-- System Information:
Debian Release: wheezy/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 3.1.0-1-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages python-django depends on:
ii python 2.7.2-9
ii python2.6 2.6.7-4
ii python2.7 2.7.2-8
Versions of packages python-django recommends:
ii libjs-jquery 1.7-1
Versions of packages python-django suggests:
ii geoip-database-contrib <none>
ii python-flup <none>
ii python-mysqldb <none>
ii python-psycopg <none>
ii python-psycopg2 2.4.2-1
ii python-sqlite 1.0.1-8
ii python-yaml 3.10-2
-- no debconf information
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]