#django #django-models #database-design
#django #django-модели #дизайн базы данных
Вопрос:
В моей модели есть поля, подобные name
и family name
которые будут повторяться. Например, «Джон» или «Джек» — это общие имена, которые должны повторяться.
Есть ли лучший способ или это нормально по стандартам нормализации проектирования модели данных?
class PropertyOwner(models.Model):
name = models.CharField(max_length=200)
family_name = models.CharField(max_length=200)
contact_number = models.PositiveIntegerField()
email = models.EmailField()
def __str__(self):
return self.name
Комментарии:
1. Если вы не планируете иметь таблицы, содержащие данные об именах (например, годы, в которые они были популярны, или некоторые другие демографические данные вокруг имен), то то, что у вас есть, в порядке. Не переусердствуйте с нормализацией базы данных. Подумайте, какая ваша базовая сущность или сущности, вокруг которых вращается ваше приложение. Если это приложение об именах и их демографии, то да, имеет смысл нормализовать до имен, но если ваше приложение касается недвижимости и их владельцев, это не имеет смысла.
Ответ №1:
1- Первый метод Создайте в своей модели метод с именем check_name_family_name, который проверяет, является ли имя готовым, поэтому ваш код после модификации будет:
class PropertyOwner(models.Model):
name = models.CharField(max_length=200)
family_name = models.CharField(max_length=200)
contact_number = models.PositiveIntegerField()
email = models.EmailField()
def __str__(self):
return self.name
def check_name_family_name(self):
if self.__class__.object.filter(name = self.name,family_name=self.family_name):
return False
else:
return True
тогда, по вашему мнению, после :
obj = yourform_obj.save(commit=False):
if obj.check_name_family_name():
obj.save()
else:
return HttpResponse('error in ...')
Метод 2- 2ed
вы можете использовать в своей форме:
def clear_family_name(self):
if PropertyOwner.object.filter(name = self.clean_data['name'],family_name=self.clean_data['family_name'):
raise ValidationError('...')
else:
return self.clean_data['family_name']