I'm making a post request to the django backend from the react frontend. For this I send a json object But the backend is giving me an error. I have given my serializer data in the form of the below json objects removing the default fields like id, created and updated fields and sent the remaining fields. The POST is not successfull showing the error as mentioned below..
Internal Server Error: /create_message/
Traceback (most recent call last):
File "C:\Users\Ajay\Desktop\New folder\Mars\marsgc\main\serializers.py", line 31, in
get_messager
return obj.messager.username
AttributeError: 'NoneType' object has no attribute 'username'
The function call at the frontend is:
let add_message = async (message) => {
await fetch(`http://localhost:8000/create_message/`,{
method: 'POST',
headers:{
'Content-Type':'application/json'
},
body:JSON.stringify(message)
})
}
const new_message = async (e) => {
e.preventDefault()
const messager = user;
const body = message;
const room_in = room.id;
await add_message({body,messager,room_in})
}
A general django rest message object is
{
"id": 2,
"body": "Hi",
"created": "2022-02-20T17:41:47.796395Z",
"updated": "2022-03-13T17:20:26.949428Z",
"messager": "ajay",
"room_in": 17
},
My models are
class Topic(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Room(models.Model):
host = models.ForeignKey(User,on_delete=models.CASCADE,null=True)
topic = models.ForeignKey(Topic,on_delete=models.CASCADE,null=True)
name = models.CharField(max_length=200)
description = models.TextField(blank=True,null=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-updated', '-created']
def __str__(self):
return self.name
class Message(models.Model):
messager = models.ForeignKey(User,on_delete=models.CASCADE,null=True)
room_in = models.ForeignKey(Room,on_delete=models.CASCADE)
body = models.TextField(blank=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.body
My serializers are
class MessageSerializer(serializers.ModelSerializer):
messager = serializers.SerializerMethodField(source='get_messager')
class Meta:
model = Message
fields = ['id','body','created','updated','messager','room_in']
def get_messager(self, obj):
return obj.messager.username
The method/view I am calling is:
@api_view(['POST'])
def create_message(request):
serializer = MessageSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)