Создание данных полей "многие-ко-многим" в сериализаторе
Я пытаюсь отправить post запрос на создание объекта - курс, но каждый раз получаю ошибку, как мне написать сериализатор для класса - курс. Что мне нужно сделать, чтобы он создавал объект и в то же время отображал список контактов вместо списка ключей?
Модели:
class Category(models.Model):
title = models.CharField(max_length=30)
imgpath = models.CharField(max_length=100)
def __str__(self):
return self.title
class Branch(models.Model):
latitude = models.CharField(max_length=250)
longitude = models.CharField(max_length=250)
address = models.CharField(max_length=250)
def __str__(self):
return self.address
class Contact(models.Model):
class Type(models.IntegerChoices):
PHONE = 1,
FACEBOOK = 2,
EMAIL = 3
type = models.IntegerField(choices=Type.choices)
value = models.CharField(max_length=250)
def __str__(self):
return self.value
class Course(models.Model):
name = models.CharField(max_length=30)
description = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='category')
logo = models.CharField(max_length=20, blank=True)
contacts = models.ManyToManyField(Contact)
branches = models.ManyToManyField(Branch, blank=True)
def __str__(self):
return self.name
Serializer:
from rest_framework import serializers
from application.category.models import Category, Branch, Contact, Course
class CategorySerializers(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class BranchSerializer(serializers.ModelSerializer):
class Meta:
model = Branch
fields = '__all__'
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = '__all__'
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = '__all__'
def create(self, validate_data):
contacts_data = validate_data.pop('contacts')
branchs_data = validate_data.pop('branches')
contacts = []
branchs = []
course = Course.objects.create(**validate_data)
# for contact_data in contacts_data:
# contact = Contact.objects.get(id=contact_data['id'])
# contacts.append(contact)
# validate_data['contacts'] = contacts
# return course
for contact_data in contacts_data:
print(contact_data)
contact_id = contacts_data.pop('id')
print(contact_id)
contact = Contact.objects.get_or_create(id=contact_id, defaults=contact_data)
contacts.append(contact)
course.contacts.add(**contact)
return course
def to_representation(self, instance):
rep = super().to_representation(instance)
return rep
Просмотров:
class CategoryView(APIView):
def get(self, request):
category = Category.objects.all()
serializer = CategorySerializers(category, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
class BranchView(ListAPIView):
queryset = Branch.objects.all()
serializer_class = BranchSerializer
class ContactViewSet(viewsets.ModelViewSet):
queryset = Contact.objects.all()
serializer_class = ContactSerializer
class CourseListView(APIView):
def get(self, request, *args, **kwargs):
course = Course.objects.all()
serializer = CourseSerializer(course, many=True)
return Response(serializer.data, status.HTTP_200_OK)
def post(self, request):
serializer = CourseSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
class CourseDetailView(APIView):
def get_object(self, pk):
try:
return Course.objects.get(pk=pk)
except Course.DoesNotExist:
raise KeyError('ТААА-ШАААААA')
def get(self, request, pk):
course = self.get_object(pk)
serializer = CourseSerializer(course)
return Response(serializer.data)
def delete(self, request, pk):
course = self.get.get_object(pk)
course.delete()
return Response(f'{course} was deleted!', status=HTTP_204_NO_CONTENT)
Я получаю эту ошибку: enter image description here введите описание изображения здесь
Чтобы ответить на ваш первый вопрос:
Что нужно сделать, чтобы создавался объект и одновременно отображался список контактов, а не список ключей?
Похоже, что вы хотите создать курс и вернуть список контактов? Если это так, то вам нужно изменить код в запросе POST
к курсу. Возможно, на что-то вроде:
def post(self, request):
serializer = CourseSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
# Get courses to return them as response
courses = Course.objects.all()
courses_serializer = CourseSerializer(courses)
return Response(courses_serializer.data)
return Response(serializer.errors)
Немного странно делать запрос API на создание определенного объекта и возвращать объекты другого типа! Но выше описано, как вы примерно это сделаете, если это то, что нужно вашему приложению.
Для ошибки, с которой вы столкнулись, мне нужно больше информации, например, трассировка стека.