必须实施'create()'

时间:2016-12-09 03:19:17

标签: jquery django django-rest-framework

我是Django的新手,我使用Apache Cassandra作为我的数据库。使用jquery ajax发送表单时出现了这个错误。

  

/ chatdata /

中的NotImplementedError      必须实施

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__'

这是我的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)

最后,我的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);
            }
        });
    });
});

更新 这是我的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'

3 个答案:

答案 0 :(得分:3)

错误来自BaseSerializer

def create(self, validated_data):
    raise NotImplementedError('`create()` must be implemented.')

serializers.Serializer类派生自BaseSerializer,并且它也没有实现create()方法。因此,您必须create a create method来保存模型。或者,请考虑使用ModelSerializer。

答案 1 :(得分:0)

如果您正在使用序列化程序,为了根据验证的数据返回完整的对象实例,我们需要实现create()和update()方法中的一个或两个。请点击链接Saving Instance

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__'

    def create(self, validated_data):
        return Chart.objects.create(**validated_data)

答案 2 :(得分:0)

使用 serializers.ModelSerializer 代替 serializers.Serializer

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


    class Meta:
        model = Chat
        fields = '__all__'

请参阅Restframework serializer部分以获取DRF指南。