I'm beginning with Django and I have a Civil Status project. I created my first models.py in order to get a Form, but I had some advices in order to normalize my database.
I made this process and I would like to know what do you think about this new restructuration.
My old models.py :
from django.db import models
from django.forms import ModelForm
from .countries import CHOIX_PAYS # Importation de la liste des pays
from .sexe import CHOIX_SEXE # Importation de la liste des sexes
# Create my Form model BirthCertificate
class BirthCertificate(models.Model) :
nom = models.CharField('Nom', max_length=30, null=False) # Lastname
prenom = models.CharField('Prénom', max_length=30, null = False) # Firstname
sexe = models.CharField('Sexe', max_length=1, choices = CHOIX_SEXE) # Choice between 'M' or 'F'
birthday = models.DateField('Date de naissance', null=False)
birthhour = models.TimeField('heure de naissance', null=False)
birthcity = models.CharField('Ville de naissance', max_length = 30, null=False)
birthcountry = models.ForeignKey(Country)
nom_pere = models.CharField('Nom père', max_length=30, null=False)
prenom_pere = models.CharField('Prénom père', max_length=30, null=False)
birthday_pere = models.DateField('Date de naissance du père', null=False)
birthcity_pere = models.CharField('Ville de naissance du père', max_length=30, null=False)
birthcountry_pere = models.CharField('Pays de naissance du père', max_length=2, choices= CHOIX_PAYS)
job_pere = models.CharField('Profession du père', max_length=30, null=False)
adress_pere = models.CharField('Adresse du père', max_length=40, null=False)
ville_pere = models.CharField('Ville du père', max_length=30, null=False)
zip_pere = models.IntegerField('Code Postal du père', null=False)
pays_pere = models.CharField('Pays du père', max_length=2, choices= CHOIX_PAYS)
nom_mere = models.CharField('Nom mère', max_length=30, null=False)
prenom_mere = models.CharField('Prénom mère', max_length=30, null=False)
birthday_mere = models.DateField('Date de naissance de la mère', null=False)
birthcity_mere = models.CharField('Ville de naissance de la mère', max_length=30, null=False)
birthcountry_mere = models.CharField('Pays de naissance de la mère', max_length=2, choices= CHOIX_PAYS)
job_mere = models.CharField('Profession de la mère', max_length=30, null=False)
adress_mere = models.CharField('Adresse de la mère', max_length=40, null=False)
ville_mere = models.CharField('Ville de la mère', max_length=30, null=False)
zip_mere = models.IntegerField('Code Postal de la mère', null=False)
pays_mere = models.CharField('Pays de la mère', max_length=2, choices= CHOIX_PAYS)
nom_temoin1 = models.CharField('Nom témoin n°1', max_length=30, null=False)
prenom_temoin1 = models.CharField('Prénom témoin n°1', max_length=30, null=False)
birthday_temoin1 = models.DateField('Date de naissance du témoin n°1', null=False)
birthcity_temoin1 = models.CharField('Ville de naissance du témoin n°1', max_length=30, null=False)
nom_temoin2 = models.CharField('Nom témoin n°2', max_length=30, null=False)
prenom_temoin2 = models.CharField('Prénom témoin n°2', max_length=30, null=False)
birthday_temoin2 = models.DateField('Date de naissance du témoin n°2', null=False)
birthcity_temoin2 = models.CharField('Ville de naissance du témoin n°2', max_length=30, null=False)
def __str__(self):
return self.nom
And my new models.py :
from django.db import models
from django.forms import ModelForm
class Country(models.Model):
code = models.CharField(max_length=3, null=False) # Example : 'FR' - 'US'
pays = models.CharField(max_length=50, null=False) # Example : 'France' - 'Etats-Unis'
def __str__(self):
return self.code
class Sexe(models.Model):
code = models.CharField(max_length=1, null=False) # Example : 'M' or 'F'
name = models.CharField(max_length=7, null=False) # Example : 'Mâle' or 'Femelle'
def __str__(self):
return self.code
class Civility(models.Model):
code = models.CharField(max_length=4, null=False) # 'Mr' - 'Mlle' - 'Mme' - ..
name = models.CharField(max_length=20, null=False) # 'Monsieur' - 'Mademoiselle' - ..
def __str__(self):
return self.code
class Parent1(models.Model):
civility = models.ForeignKey(Civility)
lastname = models.CharField(max_length=30, null=False)
firstname = models.CharField(max_length=30, null=False)
sexe = models.ForeignKey(Sexe)
birthday = models.DateField(null=False)
birthcity = models.CharField(max_length=30, null=False)
birthcountry = models.ForeignKey(Country)
job = models.CharField(max_length=30, null=False)
adress = models.CharField(max_length=30, null=False)
city = models.CharField(max_length=30, null=False)
zip = models.IntegerField(max_length=10, null=False)
country = models.ForeignKey(Country)
def __str__(self):
return self.lastname
class Parent2(models.Model):
civility = models.ForeignKey(Civility)
lastname = models.CharField(max_length=30, null=False)
firstname = models.CharField(max_length=30, null=False)
sexe = models.ForeignKey(Sexe)
birthday = models.DateField(null=False)
birthcity = models.CharField(max_length=30, null=False)
birthcountry = models.ForeignKey(Country)
job = models.CharField(max_length=30, null=False)
adress = models.CharField(max_length=30, null=False)
city = models.CharField(max_length=30, null=False)
zip = models.IntegerField(max_length=10, null=False)
country = models.ForeignKey(Country)
def __str__(self):
return self.lastname
class BirthCertificate(models.Model):
lastname = models.CharField(max_length=30, null=False)
firstname = models.CharField(max_length=30, null=False)
sexe = models.ForeignKey(Sexe)
birthday = models.DateField(null=False)
birthhour = models.TimeField(null=False)
birthcity = models.CharField(max_length=30, null=False)
birthcountry = models.ForeignKey(Country)
parent1 = models.ForeignKey(Parent1)
parent2 = models.ForeignKey(Parent2)
def __str__(self):
return self.lastname
As you can see, I tried to make a database normalization. I think it's better than the first models.py try.
Do you think that 'JOINs' are smartly written or I need to modify one more time this file ?