Как я могу создать файл с несколькими значениями без множества полей в django?
У меня есть модель:
class People(models.Model):
family = models.CharField(null=True)
phone_numbers = ?
Как я могу реализовать phone_numbers для некоторых телефонных номеров. Я думаю, что ManyToManyField не является хорошей идеей для этого.
Какова лучшая практика для этого?
Вы можете создать модель Phone и создать отношения "многие-к-одному" между Phone и People, используя ForeignKey. С помощью этого вы можете связать различные телефонные номера с одним человеком.
class People(models.Model):
family = models.CharField(null=True)
class Phone(models.Model):
number = models.CharField(max_length=15, unique=True)
person = models.ForeignKey(People, on_delete=models.CASCADE)
Теперь, например, если у вас есть экземпляр People в переменной people, вы можете получить доступ к связанным с ним номерам телефонов с помощью values_list:
people.phone_set.values_list('number', flat=True)
Примечание для вашей модели, не рекомендуется использовать null=True к CharField/TextField. В официальной документации Django говорится следующее:
Избегайте использования null в строковых полях, таких как CharField и TextField. Если поле на основе строк имеет значение null=True, это означает, что у него есть два возможных значения для "нет данных": NULL и пустая строка. В большинстве случаев, иметь два возможных значения для "нет данных" излишне; по правилам Django, нужно использовать пустую строку, а не NULL. Исключением является случай, когда для поля CharField установлены значения unique=True и blank=True. В этой ситуации null=True необходим, чтобы избежать нарушения ограничения уникальности при сохранении нескольких объектов с пустыми значениями.
.
Вы также можете взглянуть на этот вопрос, в котором рассматривается мой последний пункт.
Также я не знаю, какую логику вы хотите применить к своему проекту, но я думаю, что лучшим способом организации ваших моделей и их отношений будет создание класса Family для работы с семействами типа:
class Family(models.Model):
name = models.CharField(max_length=100)
class People(models.Model):
family = models.ForeignKey(Family, blank=True, null=True)
class Phone(models.Model):
number = models.CharField(max_length=15, unique=True)
person = models.ForeignKey(People, on_delete=models.CASCADE)
С помощью этой дополнительной модели вы сможете создать еще одно отношение "многие-к-одному" между People и Family. В зависимости от ваших потребностей, вы должны адаптировать аргументы при создании полей, те, которые я предоставил, являются лишь примером.