2017-09-03 66 views
0

我試圖用嵌套序列化器創建一個新的模型條目,但我得到一個NOT NULL constraint failed錯誤。我不知道爲什麼Django Rest框架嵌套序列化器創建NOT NULL約束

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

您收到此錯誤的原因是,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 

希望它幫助!

+0

謝謝!第二個選項用於解決我的'NOT NULL'錯誤,但現在我得到了,'TypeError at/api/messages/ int()參數必須是字符串,類似字節的對象或數字,而不是'User ''這很奇怪,因爲我認爲我需要返回一個用戶對象來保存我的模型作爲ForeignKey。 –

+0

@tay_thomp您必須嘗試在用戶的某個地方調用'int()'作爲參數。這是不正確的。 –

+0

我改變的唯一的事情是在序列化程序的create方法中使用'.get()'而不是'.filter()'......我不確定'int()'會在哪裏被調用。 –

0

,你可以嘗試使用簡單FK_NAME _id外鍵

reciever_id = validated_data['reciever'], 
#  ^^^^ 
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" 
} 
相關問題