В Django ManyToMany являются двунаправленными по умолчанию.Смысл в том, что вам нужно определить его только для одной модели, а не для обеих (и обычно вам не нужно давать имя таблице):
class Model1(models.Model):
othermodels = ManyToManyField('Model2')
class Model2(models.model):
...
Вот и все.Теперь syncdb
будет счастлив.Для получения дополнительной информации: Django docs
Единственным недостатком является то, что если вы используете администратора, у вас будет доступ к othermodels
только в Model1
.
Редактировать
Итак, если вы хотите иметь доступ к ManyToMany в обеих моделях в Admin, в настоящее время официальное решение заключается в использовании inlinemodel для второй модели.У меня была такая же проблема / необходимость всего несколько дней назад.И я не очень доволен решением inlinemodel (интенсивно в запросах к БД, если у вас много записей, невозможно использовать виджет * filter_hor Horizontal * и т. Д.).
Решение Iнайдено (это работает с Django 1.2+ и syncdb
) так:
class Model1(models.Model):
othermodels = models.ManyToManyField('Model2', through='Model1Model2')
class Model2(models.Model):
othermodels = models.ManyToManyField('Model1', through='Model1Model2')
class Model1Model2(models.Model):
model1 = models.ForeignKey(Model1)
model2 = models.ForeignKey(Model2)
class Meta:
db_table = 'app_model1_model2'
auto_created = Model1
См. тикет 897 для получения дополнительной информации.
К сожалению, если выиспользуя Юг , вам придется удалить создание таблицы app_model1_model2
в каждом автоматически создаваемом файле миграции.