Как мне сказать Django не создавать таблицу для поля, относящегося к M2M? - PullRequest
1 голос
/ 05 февраля 2011

Я использую эту маленькую жемчужину фрагмента кода Django для редактирования ManyToManyField в обоих направлениях:

class ManyToManyField_NoSyncdb(models.ManyToManyField):  
    def __init__(self, *args, **kwargs):  
        super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs)
        self.creates_table = False  

class Job(models.Model):  
    persons = ManyToManyField_NoSyncdb( Person, blank=True, db_table='person_jobs' )

(подробности фрагмента здесь )

Itпозволяет мне выбрать всех людей в данной работе из формы вакансий и, наоборот, позволяет мне выбрать все вакансии для человека из формы людей и обновляет одну таблицу jobs_persons в обоих случаях.

При переходе с Django 1.0однако, до версии 1.2 syncdb теперь генерирует ошибку дублирующейся таблицы, потому что create_table больше не является поддерживаемым свойством в базовом классе.

Есть ли другой способ указать Django 1.2 не создавать таблицу для RelatedField?

Ответы [ 3 ]

2 голосов
/ 05 февраля 2011

«Управляемая» мета-опция для моделей может быть полезна. От http://docs.djangoproject.com/en/1.2/ref/models/options/#managed

Если модель с управляемым = False содержит ManyToManyField, который указывает на другая неуправляемая модель, затем промежуточный стол для присоединиться ко многим ко многим также не будет создано. Тем не менее, посредник таблица между одним управляемым и одним Будет создана неуправляемая модель.

Если вам нужно изменить это значение по умолчанию поведение, создать посредника таблица как явная модель (с удалось установить по мере необходимости) и использовать Атрибут ManyToManyField.through для сделать отношения использовать свой обычай модель.

1 голос
/ 14 февраля 2012

Позвольте мне опубликовать новое решение в билете Джанго № 897, о котором упоминает и Этьен.Хорошо работает в Django 1.2.

class Test1(models.Model):
    tests2 = models.ManyToManyField('Test2', blank=True)

class Test2(models.Model):
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True)
1 голос
/ 05 февраля 2011

Итак, если вы хотите иметь доступ к ManyToMany в обеих моделях в Admin, в настоящее время официальное решение должно использовать inlinemodel для второй модели. У меня была такая же проблема / необходимость всего несколько дней назад. И я был не очень доволен решением inlinemodel (тяжелым в запросах БД, если у вас много записей, невозможно использовать виджет filter_horizontal и т. Д.).

Решение, которое я нашел (работает с Django 1.2+ и syncdb), таково:

class User(models.Model):
    groups = models.ManyToManyField('Group', through='UserGroups')

class Group(models.Model):
    users = models.ManyToManyField('User', through='UserGroups')

class UserGroups(models.Model):
    user_id = models.ForeignKey(User)
    group_id = models.ForeignKey(Group)

    class Meta:
        db_table = 'app_user_group'
        auto_created = User

См. Билет 897 для получения дополнительной информации.

К сожалению, если вы используете Юг , вам придется удалить создание таблицы app_user_group в каждом автоматически создаваемом файле миграции.

...