我是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'
答案 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
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指南。