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 debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to