'create()' 必须被实现

Pat*_*Pat 0 django jquery django-rest-framework

我对 Django 很陌生,我使用 Apache Cassandra 作为我的数据库。我在使用 jquery ajax 发送表单时遇到了这个错误。

NotImplementedError at /chatdata/

create() 必须实施。

这是我的 serializers.py

from rest_framework import serializers
from .models import Chat
import uuid
from django.utils import timezone

class ChatSerializer(serializers.Serializer):
    room_id = serializers.UUIDField()
    username = serializers.CharField()
    mac = serializers.CharField()
    message = serializers.CharField()
    created_at = serializers.UUIDField(default=uuid.uuid1())
    ts_created = serializers.DateTimeField(default=timezone.now())

    class Meta:
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

这是我的 views.py

from django.shortcuts import render

from django.views.decorators.csrf import csrf_exempt
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Chat, Bulletin
from .serializers import ChatSerializer, BulletinSerializer

class ChatList(APIView):

    @csrf_exempt
    def get(self, request):
        chats = Chat.objects(Chat.room_id == "bbbcb63c-027e-427b-a6e5-b575a79de797").order_by("-created_at")
        serializer = ChatSerializer(chats, many=True)
        return Response(serializer.data)

    @csrf_exempt
    def post(self, request):
        serializer = ChatSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

最后,我的 jquery 发送表单:

$(document).ready(function () {
    $('#formchat').on('submit', function(e) {
        e.preventDefault();
        $.ajax({
            url : $(this).attr('action') || window.location.pathname,
            type: "POST",
            header: {
                'Access-Control-Allow-Origin': '*'
            },
            data: $(this).serialize(),
            dataType: 'json',
            success: function (data) {
                $("#chatinput").val('');
            },
            error: function (jXHR, textStatus, errorThrown) {
                alert(errorThrown);
            }
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

更新: 这是我的models.py

import uuid
from django.utils import timezone
from cassandra.cqlengine import columns
from django_cassandra_engine.models import DjangoCassandraModel

class Chat(DjangoCassandraModel):
    room_id = columns.UUID(partition_key=True, default=uuid.uuid4())
    username = columns.Text(required=True)
    mac = columns.Text(min_length=17, max_length=17, required=True)
    message = columns.Text(required=True)
    created_at = columns.UUID(primary_key=True, default=uuid.uuid1(), required=True, clustering_order="DESC")
    ts_created = columns.DateTime(default=timezone.now())

    class Meta:
        get_pk_field = 'room_id'
Run Code Online (Sandbox Code Playgroud)

小智 8

使用serializers.ModelSerializer而不是serializers.Serializer

class ChatSerializer(serializers.ModelSerializer):
   ...fields here


    class Meta:
        model = Chat
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

请参阅 Restframework序列化器部分以获取 DRF 指南。


e4c*_*4c5 6

错误来自BaseSerializer

def create(self, validated_data):
    raise NotImplementedError('`create()` must be implemented.')
Run Code Online (Sandbox Code Playgroud)

serializers.Serializer班是源自BaseSerializer它没有实现create()任何一种方法。所以你必须create a create method保存你的模型。或者,考虑改用 ModelSerializer。