我尝试使用嵌套序列化程序创建新的模型条目,但我收到NOT NULL constraint failed
错误。我不确定为什么
models.py
:
class Messages(models.Model):
sender = models.ForeignKey(User, related_name="sender")
reciever = models.ForeignKey(User, related_name="reciever")
message = models.TextField(null=True, blank=True)
created_at = models.DateField(default=datetime.now)
subject = models.CharField(max_length=150,blank=True)
read = models.BooleanField(default=False)
def __str__(self):
return self.reciever.username
Serializer
class MessageSerializer(serializers.ModelSerializer):
reciever = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
class Meta:
model = Messages
fields = '__all__'
depth=1
def create(self,validated_data):
new_message = Messages.objects.create(
sender = self.context['request'].user,
# reciever = User.objects.filter(id=validated_data['reciever']),
message = validated_data['message'],
subject = validated_data['subject'],
created_at = datetime.now(),
)
new_message.save()
return new_message
POST请求:
{
"reciever":12,
"message":"Hello World",
"subject":"newtest"
}
响应:
IntegrityError at /api/messages/
NOT NULL constraint failed: index_messages.reciever_id
views.py
:
class MessagesCreate(mixins.CreateModelMixin,
mixins.ListModelMixin,
generics.GenericAPIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
serializer_class = MessageSerializer
queryset = Messages.objects.all()
def get(self,request,*args,**kwargs):
return self.retrieve(request, *args, **kwargs)
def post (self, request, *args, **kwargs):
return self.create(request,*args,**kwargs)
答案 0 :(得分:0)
您收到此错误的原因是receiver
字段不能为null
。
有两种解决方法。
首先,您可以创建该字段nullable
:
reciever = models.ForeignKey(User, related_name="reciever", blank=True, null=True)
或者,在create
方法中创建消息对象时,应该为此字段提供值:
def create(self,validated_data):
new_message = Messages.objects.create(
sender = self.context['request'].user,
receiver = User.objects.get(id=validated_data['reciever']),
message = validated_data['message'],
subject = validated_data['subject'],
created_at = datetime.now(),
)
new_message.save()
return new_message
希望它有所帮助!
答案 1 :(得分:0)
您可以尝试使用fk_name _id
作为外键
reciever_id = validated_data['reciever'],
# ^^^^
答案 2 :(得分:0)
S.O。到Jahongir Rahmonov!
以下是答案:
class MessageSerializer(serializers.ModelSerializer):
reciever = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
class Meta:
model = Messages
fields = '__all__'
基本上,我删除了自定义创建方法,并将其作为POST
请求发送:
{
"reciever":
12,
"sender":1,
"message":"Does this",
"subject":"Work"
}