It's time to get our hands in the code. Create your Django project. I will be using my github simple Django project already created:
https://github.com/38130/mysite
- Project named mysite
- With an app named polls
- some simple configurations for static and media
- a simple view, url and template for an index.html page
There are seven Django models:
- Quiz
- Question
- Answer
- Dimension
- Profile
- AnswerDimension
- ProfileRule
from django.db import models
import uuid
class Quiz(models.Model):
name = models.CharField(max_length=100)
uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
def __str__(self):
return self.name
class Question(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
text = models.TextField()
def __str__(self):
return f"{self.text[:50]}..." if len(self.text) > 50 else self.text
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
text = models.CharField(max_length=200)
def __str__(self):
return self.text
class Dimension(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
class Meta:
verbose_name = "Dimension"
verbose_name_plural = "Dimensions"
def __str__(self):
return f"{self.name} ({self.quiz.name})"
class Profile(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
description = models.TextField()
priority = models.PositiveIntegerField(default=0)
def __str__(self):
return f"{self.name} ({self.quiz.name})"
class AnswerDimension(models.Model):
answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
dimension = models.ForeignKey(Dimension, on_delete=models.CASCADE)
weight = models.IntegerField()
def __str__(self):
return f"{self.answer.text} → {self.dimension.name} ({self.weight})"
class ProfileRule(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
dimension = models.ForeignKey(Dimension, on_delete=models.CASCADE)
min_value = models.IntegerField(null=True, blank=True)
max_value = models.IntegerField(null=True, blank=True)
def __str__(self):
parts = []
if self.min_value is not None:
parts.append(f">= {self.min_value}")
if self.max_value is not None:
parts.append(f"<= {self.max_value}")
return f"{self.dimension.name} {' and '.join(parts)}"
python manage.py makemigrations
python manage.py migrate
In the next post we will take all these models to the Django admin in an optimized way.