0

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)
  • Well... your field `messager` has `null=True` meaning there can be rows where this field is null. So in the case that such row occurs `obj.messager.username` would end up being equivalent to `(None).username`... – Abdul Aziz Barkat Mar 14 '22 at 17:14
  • Does this answer your question? [Why do I get AttributeError: 'NoneType' object has no attribute 'something'?](https://stackoverflow.com/questions/8949252/why-do-i-get-attributeerror-nonetype-object-has-no-attribute-something) Also see: [Django: AttributeError: 'NoneType' object has no attribute 'username'](https://stackoverflow.com/questions/65376523/django-attributeerror-nonetype-object-has-no-attribute-username) – Abdul Aziz Barkat Mar 14 '22 at 17:16
  • Yeah it is a problem I just found out but now I'm getting another error i.e; File "C:\Users\Ajay\Desktop\New folder\Mars\marsgc\main\serializers.py", line 31, in get_messager return obj.messager.username File "C:\Users\Ajay\Desktop\New folder\Mars\marsgc\mars\lib\site-packages\django\db\models\fields\related_descriptors.py", line 197, in __get__ raise self.RelatedObjectDoesNotExist( main.models.Message.messager.RelatedObjectDoesNotExist: Message has no messager. – Ajay Kumar Mar 14 '22 at 17:18
  • Just now I removed the null=True and ran the migrations again but it isn't allowing as it is required to have a default value to the foreign key – Ajay Kumar Mar 14 '22 at 17:27

0 Answers0