Python 为Django中的每个用户创建和跟踪模型实例
所以我正在开发这个简单的测验应用程序,我想我把我的模型搞砸了。 最初的目标是要有一个测验参与者模型、测验类别、等级和每个测验下的问题列表。然而,我已经厌倦了如何构建模型,让每个用户都有一个测验、级别和问题的实例,以便跟踪玩家的进度 型号.PYPython 为Django中的每个用户创建和跟踪模型实例,python,django,django-models,Python,Django,Django Models,所以我正在开发这个简单的测验应用程序,我想我把我的模型搞砸了。 最初的目标是要有一个测验参与者模型、测验类别、等级和每个测验下的问题列表。然而,我已经厌倦了如何构建模型,让每个用户都有一个测验、级别和问题的实例,以便跟踪玩家的进度 型号.PY from django.db import models from django.urls import reverse from django.contrib.auth.models import User from django.db.models.s
from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
# QUIZ CLASS MODEL
class Quiz(models.Model):
category = models.CharField(max_length=200, help_text="quiz name")
class Meta:
ordering = ['category',]
def __str__(self):
return f"{self.category}"
# LEVEL CLASS MODEL
class Level(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
DIFFICULTY = [
(("level1"),("level1")), (("level2"),("level2")), (("level3"),("level3")), (("level4"),("level4")), (("level5"),("level5")),
(("level6"),("level6")), (("level7"),("level7")), (("level8"),("level8")), (("level9"),("level9")), (("level10"),("level10")),
(("bonus"),("bonus"))
]
levels = models.CharField(max_length=7, choices=DIFFICULTY)
is_completed = models.BooleanField(default=False, help_text="check if category level has been completed")
def __str__(self):
return self.levels
# QUESTION CLASS MODELS
class Question(models.Model):
question = models.CharField(max_length=1000)
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
is_answered = models.BooleanField(default=False)
def __str__(self):
return self.question
# ANSWER CLASS MODEL
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice = models.CharField(max_length=1000)
is_correct = models.BooleanField(default=False)
def __str__(self):
return self.choice
# QUIZ TAKER MODEL
class QuizTaker(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, null=True)
questions = models.ForeignKey(Question, on_delete=models.CASCADE, null=True)
score = models.IntegerField(default=0)
token = models.IntegerField(default=0)
def __str__(self):
return self.user.username
@receiver(post_save, sender=User)
def create_quiztaker(sender, instance, created, **kwargs):
if created:
QuizTaker.objects.create(user=instance)
@receiver(post_save, sender=User)
def update_quiztaker(sender, instance, created, **kwargs):
try:
if created == False:
instance.quiztaker.save()
except:
QuizTaker.objects.create(user=instance)
from django.contrib import admin
from .models import Question, QuizTaker, Quiz, Answer, Level
# Register your models here.
# admin.site.register(Question)
class answeinline(admin.TabularInline):
model = Answer
min_num = 4
max_num = 4
class levelinline(admin.TabularInline):
model = Level
min_num = 10
max_num = 11
@admin.register(Question)
class QuestionAdmin(admin.ModelAdmin):
list_display = ['question', 'quiz', 'is_answered']
inlines = [answeinline]
@admin.register(Quiz)
class QuizAdmin(admin.ModelAdmin):
inlines = [levelinline]
admin.site.register(QuizTaker)
ADMIN.PY
from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
# QUIZ CLASS MODEL
class Quiz(models.Model):
category = models.CharField(max_length=200, help_text="quiz name")
class Meta:
ordering = ['category',]
def __str__(self):
return f"{self.category}"
# LEVEL CLASS MODEL
class Level(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
DIFFICULTY = [
(("level1"),("level1")), (("level2"),("level2")), (("level3"),("level3")), (("level4"),("level4")), (("level5"),("level5")),
(("level6"),("level6")), (("level7"),("level7")), (("level8"),("level8")), (("level9"),("level9")), (("level10"),("level10")),
(("bonus"),("bonus"))
]
levels = models.CharField(max_length=7, choices=DIFFICULTY)
is_completed = models.BooleanField(default=False, help_text="check if category level has been completed")
def __str__(self):
return self.levels
# QUESTION CLASS MODELS
class Question(models.Model):
question = models.CharField(max_length=1000)
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
is_answered = models.BooleanField(default=False)
def __str__(self):
return self.question
# ANSWER CLASS MODEL
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice = models.CharField(max_length=1000)
is_correct = models.BooleanField(default=False)
def __str__(self):
return self.choice
# QUIZ TAKER MODEL
class QuizTaker(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, null=True)
questions = models.ForeignKey(Question, on_delete=models.CASCADE, null=True)
score = models.IntegerField(default=0)
token = models.IntegerField(default=0)
def __str__(self):
return self.user.username
@receiver(post_save, sender=User)
def create_quiztaker(sender, instance, created, **kwargs):
if created:
QuizTaker.objects.create(user=instance)
@receiver(post_save, sender=User)
def update_quiztaker(sender, instance, created, **kwargs):
try:
if created == False:
instance.quiztaker.save()
except:
QuizTaker.objects.create(user=instance)
from django.contrib import admin
from .models import Question, QuizTaker, Quiz, Answer, Level
# Register your models here.
# admin.site.register(Question)
class answeinline(admin.TabularInline):
model = Answer
min_num = 4
max_num = 4
class levelinline(admin.TabularInline):
model = Level
min_num = 10
max_num = 11
@admin.register(Question)
class QuestionAdmin(admin.ModelAdmin):
list_display = ['question', 'quiz', 'is_answered']
inlines = [answeinline]
@admin.register(Quiz)
class QuizAdmin(admin.ModelAdmin):
inlines = [levelinline]
admin.site.register(QuizTaker)
您是否面临架构设计问题?不知道我是否会说架构问题。我的模型似乎不适合预期的工作。你是否面临模式设计问题?不知道我是否会说模式问题。我的模型似乎不适合预期的工作。