Como postar e atualizar usando o Django
Eu tenho esses dois 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)
Estou tentando fazer isso para que eu possa criar novas anotações e atualizar anotações existentes para palestras específicas a partir da página Palestra.
Eu tenho estas opiniões:
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
Que eu estou usando para tentar permitir que novas notas sejam postadas, no entanto, elas parecem responder constantemente com erro:
palestra: {title: ["A palestra com este título já existe"]}
O que me leva a acreditar que está tentando postar novas anotações em vez de atualizar a existente. Também estou confuso sobre o motivo pelo qual está produzindo esse erro, em vez de simplesmente adicionar outro objeto do Notes ao banco de dados, porque se o Lecture for uma ForeignKey of Notes, isso não implica um relacionamento muitos para um?
EDIT: Atualizei meus serializadores para incluir métodos de criação e atualização:
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
Mas ainda recebo este erro:
Não é possível atribuir "OrderedDict ([('lecture_no', 1), ('title'," Título da palestra, ('youtubeLink', 'Link1')), ('course',), ('keywords', 'These keywords'. )]) ":" Notes.lecture "deve ser uma instância" Lecture ".