Django Rest Framework嵌套序列化程序创建NOT NULL约束

时间:2017-09-03 12:25:20

标签: python django django-rest-framework

我尝试使用嵌套序列化程序创建新的模型条目,但我收到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)

3 个答案:

答案 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"
}