Django Quiz - Database

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.