Create question with options from same endpoint
so i am making a backend system using DRF in Django, this is my first project in django and drj, i am using django purely as a rest backend
i am making a Quiz/mcq application
this is from my questions app , models.py
from django.db import models
from classifications.models import SubSubCategory
class Question(models.Model):
ANSWER_TYPES = [
('single', 'Single Correct'),
('multiple', 'Multiple Correct'),
]
text = models.TextField()
answer_type = models.CharField(max_length=10, choices=ANSWER_TYPES, default='single')
difficulty = models.CharField(
max_length=10,
choices=[('easy', 'Easy'), ('medium', 'Medium'), ('hard', 'Hard')],
default='medium'
)
explanation = models.TextField(blank=True, null=True)
subsubcategories = models.ManyToManyField(SubSubCategory, related_name='questions', blank=True)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return 'question'
class Meta:
ordering = ['-created_at']
def correct_options(self):
return self.options.filter(is_correct=True)
def incorrect_options(self):
return self.options.filter(is_correct=False)
class Option(models.Model):
question = models.ForeignKey(Question, related_name='options', on_delete=models.CASCADE)
label = models.CharField(max_length=5)
text = models.TextField()
is_correct = models.BooleanField(default=False)
def __str__(self):
return "options"
and i am using Model viewset with router, but here when i try to create question , i am having to request in two different endpoint , one for creating question and another for creating options for questions
views.py
from rest_framework import viewsets
from .models import Question, Option
from .serializers import QuestionSerializer, OptionSerializer
from core.permissions import IsAdminOrReadOnlyForAuthenticated
from django.db.models import Q
class OptionViewSet(viewsets.ModelViewSet):
queryset = Option.objects.all()
serializer_class = OptionSerializer
class QuestionViewSet(viewsets.ModelViewSet):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
class SelectViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = QuestionSerializer
queryset = Question.objects.none()
def get_queryset(self):
queryset = Question.objects.all().prefetch_related('subsubcategories')
category_ids = self.request.query_params.getlist('category_id')
subcategory_ids = self.request.query_params.getlist('subcategory_id')
subsubcategory_ids = self.request.query_params.getlist('subsubcategory_id')
category_ids = [int(x) for x in category_ids if x.isdigit()]
subcategory_ids = [int(x) for x in subcategory_ids if x.isdigit()]
subsubcategory_ids = [int(x) for x in subsubcategory_ids if x.isdigit()]
q_filter = Q()
if category_ids:
q_filter |= Q(subsubcategories__subcategory__category__id__in=category_ids)
if subcategory_ids:
q_filter |= Q(subsubcategories__subcategory__id__in=subcategory_ids)
if subsubcategory_ids:
q_filter |= Q(subsubcategories__id__in=subsubcategory_ids)
if q_filter:
queryset = queryset.filter(q_filter)
return queryset.distinct()
please suggest me, what i shall do? change the db design so that all CRUD can be handled via model view set because currently to do operations of options i am having to request in different endpoint
this is my serializer currently
from rest_framework import serializers
from .models import Question, Option
class OptionSerializer(serializers.ModelSerializer):
class Meta:
model = Option
fields = ('label','text','id')
class QuestionSerializer(serializers.ModelSerializer):
options = OptionSerializer(many=True)
class Meta:
model = Question
fields = ('id', 'text', 'answer_type', 'difficulty', 'explanation', 'subsubcategories', 'options')
or do i have to write custom implementation for CRUD for options inside question