Разрешение выбора параметров в ManyToMany одним объектом за раз - PullRequest
0 голосов
/ 03 марта 2019

У меня есть модель, определенная следующим образом:

class Group(models.Model):
    name = models.CharField(max_length=30)
    countries = models.ManyToManyField(Country)

Мне нужно запретить присваивать странам несколько групп через администратора Django.

Как мне этого добиться?

Я понимаю, что могу просто поместить group = models.ForeignKey на мою Country модель вместо отношения ManyToMany, но это изменит способ редактирования вещей в Django Admin.

1 Ответ

0 голосов
/ 04 марта 2019

Я настоятельно рекомендую, чтобы структура вашей базы данных точно отражала вашу модель данных, а не основывалась на том, что создает наиболее удобные формы по умолчанию в Django.Настраивать формы несложно, но их трудно избежать и опасно переносить повреждение данных.Например, если вы сделаете так, как вы предлагаете, ничего не сделаете, чтобы предотвратить создание недействительных данных другими способами (представлениями, консолью и т. Д.)

Так что одним из вариантов является использование ForeignKeyограничение, как вы предложили.

Компромиссным решением было бы сохранить ManyToManyField и наложить соответствующее ограничение на модель through.Это позволит вам продолжать использовать любые формы, которые вы используете в настоящее время.Примерно так:

class Group(models.Model):
    name = models.CharField(max_length=30)
    countries = models.ManyToManyField(Country, through="GroupCountry")

class GroupCountry(models.Model):
    group = models.ForeignKey(Group)
    country = models.ForeignKey(Country, unique=True)

Обратите внимание, что любое решение, включающее ManyToManyField, будет иметь снижение производительности, так как есть дополнительная таблица, к которой нужно присоединиться.Также обратите внимание, что это изменение включает в себя потенциально сложную миграцию;Вы можете найти несколько вопросов и ответов о том, как это сделать.

...