Как реализовать операцию CRUD с помощью миксинов Django Rest
Я пытаюсь реализовать операцию CRUD
с вложенным сериализатором с несколькими моделями данных, чтобы я мог записывать все поля сразу при вызове конечной точки API. Я использую mixins
из REST фреймворка https://www.django-rest-framework.org/api-guide/generic-views/#mixins
Я нашел несколько подходящих примеров, но все же мой сериализатор возвращает только поля из Student
модели для CRUD
операции. Я не могу увидеть поле Course
модели в REst api ui.
Как я могу выполнить CRUD-операцию с помощью mixins
?
Как отобразить данные из двух моделей без создания новой модели в Django?
использование класса mixins, определенного в Django rest framework
models.py
class Student(models.Model):
student_id = models.UUIDField(default=uuid.uuid4, unique=True,
primary_key=True, editable=False)
firstName = models.CharField(max_length=20)
age = models.IntegerField(default=18)
class Course(models.Model):
student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
courseName = models.CharField(max_length=20)
courseYear = models.IntegerField(default=2021)
student = models.ManyToManyField(Student, related_name='courses')
class Homework(models.Model):
student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
hwName = models.CharField(max_length=20)
hwPossScore = models.IntegerField(default=100)
course = models.ForeignKey(Course, related_name='homeworks', on_delete=models.CASCADE, null=True, blank=True)
students = models.ManyToManyField(Student)
Serializers.py
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = "__all__"
class HomeworkSerializer(serializers.ModelSerializer):
class Meta:
model = Homework
fields = __all__
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = "__all__"
###I combine both Student and Course into one
class All_Serializer(serializers.ModelSerializer):
students = serializers.SerializerMethodField()
homeworks = serializers.SerializerMethodField()
courses = serializers.SerializerMethodField()
def get_students(self, obj):
students = obj.student_set.all()
serializer = StudentSerializer(students, many=True)
return serializer.data
def get_homeworks(self, obj):
homeworks = obj.homework_set.all()
serializer = HomeworkSerializer(homeworks, many=True, read_only=True)
return serializer.data
def get_courses(self, obj):
courses = obj.courses_set.all()
serializer = CourseSerializer(courses, many=True, read_only=True)
return serializer.data
class Meta:
model = Student
fields = ('student_id','firstName','age','homeworks','courses')
views.py
class Main_mixins(generics.GenericAPIView,
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin):
serializer_class = All_Serializer
queryset = Student.objects.all()
lookup_field = 'student_id'
def get(self, request, student_id=None):
if student_id:
return self.retrieve(request, student_id)
else:
return self.list(request)
def post(self, request):
return self.create(request)
def perform_create(self, serializer):
serializer.save()
def put(self, request, student_id=None):
return self.update(request, student_id=None, homeworks, courses)
В пользовательском интерфейсе django rest api я вижу только student_id. Других полей там нет. Добавьте сюда экспертов, чтобы помочь @WillemVanOnsem @Muhammadhassan @akazuko