Как избежать вертикального повторения для общего имени и фамилии?

#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']