Позволяет выбирать параметры во множестве объектов одновременно

#django #django-models #django-admin

#django #django-модели #django-администратор

Вопрос:

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

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

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

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

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

Ответ №1:

Моя настоятельная рекомендация заключается в том, чтобы структура вашей базы данных точно отражала вашу модель данных, а не основывалась на том, что создает наиболее удобные формы по умолчанию в 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 , приведет к снижению производительности, поскольку необходимо объединить дополнительную таблицу. Также обратите внимание, что это изменение связано с потенциально сложной миграцией; вы можете найти несколько вопросов и ответов о том, как это сделать.

Комментарии:

1. Спасибо, я буду придерживаться ForeignKey.