Opened 9 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:


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
            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):
    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.room_id FROM m2db_class LEFT OUTER JOIN m2db_class_teacher AS m2m_m2db_class__teacher ON = 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 9 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