#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.