Cómo publicar y actualizar usando Django
Tengo estos dos modelos:
class Lecture(models.Model):
lecture_no = models.IntegerField(null=True)
title = models.CharField(max_length=128, unique=True, null=True)
youtubeLink = models.CharField(max_length=128, unique=True, null=True)
course = models.ForeignKey(Course, null=True)
keywords = models.TextField(max_length=300, null=True)
#Could add Next Rerun Date & Time
def __str__(self):
return self.title
class Notes(models.Model):
notes = models.TextField(null=True)
lecture = models.ForeignKey(Lecture, null=True)
def __str__(self):
return str(self.notes)
Estoy tratando de hacerlo para poder crear nuevas notas y actualizar las notas existentes para conferencias específicas desde la página de la Conferencia.
Tengo estas opiniones:
class LectureViewSet(viewsets.ModelViewSet):
serializer_class = LectureSerializer
# Queries the data to find the right lectures for a given course
def get_queryset(self):
course_id = self.request.query_params.get('course', False)
if course_id:
lectures = Lecture.objects.filter(course=course_id)
else:
lectures = Lecture.objects.all()
return lectures
@detail_route(methods=['post'])
def set_notes(self, request, pk=None):
lecture = self.get_object()
serializer = NotesSerializer(data=request.data)
if serializer.is_valid():
lecture.set_notes(serializer.data['notes'])
lecture.save()
return Response({'status': 'notes saved'})
else:
return Response(serializer.errors,
status="Error.")
class NotesViewSet(viewsets.ModelViewSet):
queryset = Notes.objects.all()
serializer_class = NotesSerializer
def get_queryset(self):
lecture_id = self.request.query_params.get('lecture', False)
if lecture_id:
notes = Notes.objects.filter(lecture=lecture_id)
else:
notes = Notes.objects.all()
return notes
Lo que estoy usando para tratar de permitir que se publiquen nuevas notas, sin embargo, parecen responder constantemente con error:
conferencia: {título: ["La conferencia con este título ya existe"]}
Lo que me lleva a creer que está tratando de publicar nuevas Notas en lugar de actualizar la existente. También estoy confundido sobre por qué está produciendo este error en lugar de simplemente agregar otro objeto de Notes a la base de datos porque si Lecture es una ForeignKey of Notes, ¿eso no implica una relación de muchos a uno?
EDITAR: He actualizado mis serializadores para incluir métodos de creación y actualización:
def create(self, validated_data):
notes = Notes.objects.create(**validated_data)
return notes
def update(self, instance, validated_data):
instance.notes = validated_data.get('notes', instance.notes)
return instance
Pero aún recibo este error:
No se puede asignar "OrderedDict ([('lecture_no', 1), ('title'," Lecture Title, ('youtubeLink', 'Link1'), ('course',), ('keywords', 'Estas palabras clave'. )]) ":" Notes.lecture "debe ser una instancia de" Lecture ".