如何使用Django进行POST和更新

时间:2016-01-02 17:45:26

标签: django views django-rest-framework http-request

我有这两个模型:

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)

我正在尝试这样做,以便我可以在Lecture页面内创建新笔记并更新特定讲座的现有笔记。

我有这些观点:

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

我正在尝试使用以允许发布新笔记,但是,他们似乎不断回应错误:

讲座:{title:[“已经存在此标题的讲座”]}

这使我相信它正在尝试发布新的Notes而不是更新现有的Notes。我也很困惑为什么它产生这个错误而不是简单地将另一个Notes对象添加到数据库,因为如果Lecture是Notes的ForeignKey那么这不意味着多对一关系吗?

编辑:我已更新我的序列化程序以包含创建和更新方法:

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

但我仍然收到此错误:

无法指定“OrderedDict([('lecture_no',1),('title',”Lecture Title,('youtubeLink','Link1'),('course'),('keywords','这些关键字。')])“:”Notes.lecture“必须是”讲座“实例。

0 个答案:

没有答案