Opened 9 years ago

Closed 9 years ago

Last modified 9 years ago

#9786 closed (fixed)

Files (and subclasses) override __eq__ but not __ne__

Reported by: xtian <xtian@…> Owned by: nobody
Component: Database layer (models, ORM) Version: master
Severity: Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:


We were trying to compare two model objects using the following function:

def allModelFieldsEqual(a, b):
    fields = [ for f in a._meta.fields]
    for name in fields:
        if getattr(a, name) != getattr(b, name):
            return False
    return True

This fails when the models contain FileFields, because File doesn't implement ne. Confusingly, because it implements eq, the values also compare equal.

(Pdb) !a.largeImage
<ImageFieldFile: /images/first-large-image.png>
(Pdb) !b.largeImage
<ImageFieldFile: /images/first-large-image.png>
(Pdb) !a.largeImage == b.largeImage
(Pdb) !a.largeImage != b.largeImage

It should probably be implemented as:

    def __ne__(self, other):
        return not self == other

Change History (2)

comment:1 Changed 9 years ago by Malcolm Tredinnick

Resolution: fixed
Status: newclosed

Fixed in r9647.

comment:2 Changed 9 years ago by Malcolm Tredinnick

(In [9648]) [1.0.X] Fixed #9786 -- Fixed inequality checking for django.db.models.fields.file.FieldFile class.

Backport of r9647 from trunk.

Note: See TracTickets for help on using tickets.
Back to Top