| 379 | | # Handles setting many-to-many related objects. |
|---|
| 380 | | # Example: Album.set_songs() |
|---|
| 381 | | def _set_related_many_to_many(self, rel_class, rel_field, id_list): |
|---|
| 382 | | id_list = map(int, id_list) # normalize to integers |
|---|
| 383 | | rel = rel_field.rel.to |
|---|
| 384 | | m2m_table = rel_field.m2m_db_table() |
|---|
| 385 | | this_id = self._get_pk_val() |
|---|
| 386 | | cursor = connection.cursor() |
|---|
| 387 | | cursor.execute("DELETE FROM %s WHERE %s = %%s" % \ |
|---|
| 388 | | (backend.quote_name(m2m_table), |
|---|
| 389 | | backend.quote_name(rel_field.m2m_column_name())), [this_id]) |
|---|
| 390 | | sql = "INSERT INTO %s (%s, %s) VALUES (%%s, %%s)" % \ |
|---|
| 391 | | (backend.quote_name(m2m_table), |
|---|
| 392 | | backend.quote_name(rel_field.m2m_column_name()), |
|---|
| 393 | | backend.quote_name(rel_field.m2m_reverse_name())) |
|---|
| 394 | | cursor.executemany(sql, [(this_id, i) for i in id_list]) |
|---|
| 395 | | transaction.commit_unless_managed() |
|---|
| 396 | | |
|---|