Opened 8 years ago

Closed 8 years ago

Last modified 5 years ago

#7042 closed (fixed)

Admin Interface generates malformed SQL with many-to-many fields

Reported by: alexander.hungenberg@… Owned by: Charlie La Mothe
Component: Database layer (models, ORM) Version: master
Severity: Keywords: aug22sprint
Cc: charlie@… Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

Description

I am using latest Revision (7438)

class Teacher(models.Model):
    short = models.CharField(max_length=20)
    account = models.ForeignKey(User, unique=True, blank=True, null=True)
    
    def __unicode__(self):
        if self.account:
            return self.account.last_name + ", " + self.account.first_name
        else:
            return self.short
    
    class Admin:
        list_display = ('account', 'short')

class Class(models.Model):
    name = models.CharField(max_length=3, unique=True)
    teacher = models.ManyToManyField(Teacher, unique=True, blank=True, null=True)
    room = models.ForeignKey(Room, blank=True, null=True)
    enabled_functions = models.ManyToManyField(Function, blank=True, null=True)
    
    def __unicode__(self):
        return self.name
    
    class Admin:
        list_display = ('name', 'room')

When I try to add a Teacher to a Class via the admin-interface, it throws the following Exception:

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 1")

the executed query taken from MySQL Log is

SELECT m2db_class.id,m2db_class.name,m2db_class.room_id FROM m2db_class LEFT OUTER JOIN m2db_class_teacher AS m2m_m2db_class__teacher ON m2db_class.id = m2m_m2db_class__teacher.class_id WHERE (m2m_m2db_class__teacher.teacher_id = ("'1'",))

Other many-to-many fields work normal...

If you need further Infos, contect me by mail or as defreng in #django. I could even give you some access to the admin page

Attachments (1)

t7042_r8472_patch.diff (2.3 KB) - added by Charlie La Mothe 8 years ago.
Adds model validation to check that unique = True is not set in ManyToManyFields. Also contains invalid_model tests to test for the validation.

Download all attachments as: .zip

Change History (9)

comment:1 Changed 8 years ago by anonymous

Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset

the trigger seems to be the unique=True option in the Class model

comment:2 Changed 8 years ago by Jason Davies

I can confirm this bug, it seems to occur when unique=True is used in a ManyToManyField.

comment:3 Changed 8 years ago by Eric Holscher

milestone: 1.0
Triage Stage: UnreviewedAccepted

comment:4 Changed 8 years ago by anonymous

Owner: changed from nobody to Charlie La Mothe

Changed 8 years ago by Charlie La Mothe

Attachment: t7042_r8472_patch.diff added

Adds model validation to check that unique = True is not set in ManyToManyFields. Also contains invalid_model tests to test for the validation.

comment:5 Changed 8 years ago by Charlie La Mothe

Cc: charlie@… added
Component: Admin interfaceDatabase wrapper
Has patch: set
Keywords: aug22sprint added
Resolution: fixed
Status: newclosed

comment:6 Changed 8 years ago by Charlie La Mothe

Resolution: fixed
Status: closedreopened

comment:7 Changed 8 years ago by Malcolm Tredinnick

Resolution: fixed
Status: reopenedclosed

(In [8488]) Fixed #7042 -- The management validation command nows alerts users to the
presence (and incorrectness) of unique=True on ManyToManyFields. This has never
worked and generates invalid SQL. Now it's raised as an explicit error during
validation. Thanks to clamothe for the patch.

Still needs a docs change to make this clear, but that goes to the docs
refactor branch.

comment:8 Changed 5 years ago by Jacob

milestone: 1.0

Milestone 1.0 deleted

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