#17466: Model __eq__ does not compare correctly between normal objects and 
deferred
objects
---------------------------------------------+--------------------
     Reporter:  Raphaël Hertzog <hertzog@…>  |      Owner:  nobody
         Type:  Bug                          |     Status:  new
    Component:  Uncategorized                |    Version:  1.3
     Severity:  Normal                       |   Keywords:
 Triage Stage:  Unreviewed                   |  Has patch:  0
Easy pickings:  0                            |      UI/UX:  0
---------------------------------------------+--------------------
 Enrico Zini <[email protected]> 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
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/17466>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to