Opened 7 years ago

Closed 7 years ago

Last modified 4 years ago

#7042 closed (fixed)

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

Reported by: alexander.hungenberg@… Owned by: clamothe
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 clamothe 7 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 7 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 7 years ago by esaj

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

comment:3 Changed 7 years ago by ericholscher

  • milestone set to 1.0
  • Triage Stage changed from Unreviewed to Accepted

comment:4 Changed 7 years ago by anonymous

  • Owner changed from nobody to clamothe

Changed 7 years ago by clamothe

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 7 years ago by clamothe

  • Cc charlie@… added
  • Component changed from Admin interface to Database wrapper
  • Has patch set
  • Keywords aug22sprint added
  • Resolution set to fixed
  • Status changed from new to closed

comment:6 Changed 7 years ago by clamothe

  • Resolution fixed deleted
  • Status changed from closed to reopened

comment:7 Changed 7 years ago by mtredinnick

  • Resolution set to fixed
  • Status changed from reopened to closed

(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 4 years ago by jacob

  • milestone 1.0 deleted

Milestone 1.0 deleted

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