Как сериализовать модель, когда она имеет отношение к ключу Foriegn с моделью пользователя по умолчанию в Django

#json #python-3.x #django

#json #python-3.x #джанго

Вопрос:

Models.py У меня есть модель с именем Message, в которой реализован ключ Foriegn с пользовательской моделью Django по умолчанию.я хочу сериализовать эту модель.

 from django.db import models
 from django.contrib.auth.models import User
 from django.conf import settings
      
 class Message(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,)
    content=models.CharField(max_length=100)
    timestamp=models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.author.username
 

views.py

 from classes.models import ClassRoom,Student
from classes import views
from django.http import HttpResponse, JsonResponse
from django.contrib.auth.models import User
from chat.models import Message
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import render
from django.core import serializers

@login_required
def course_chat_room(request,id):
    course = ClassRoom.objects.get(id=id)
    return render(request, 'chat/room.html',{'course':course})

def getMessages(request,id):
    serials = serializers.serialize('json', Message.objects.all().order_by("-id"))
    return JsonResponse(serials, safe=False)

 

 
 

urls.py
вот мои URL-адреса этого приложения

 from django.urls import path
from . import views

    app_name = 'chat'
    urlpatterns = [
    
        path('room/<int:id>/', views.course_chat_room,name='course_chat_room'),
        path('room/<int:id>/ajax/', views.getMessages,name='getMessages'),
    
]
 

Результат
когда я запускаю это, я получаю результат, подобный приведенному ниже. я получаю идентификатор автора = 10,11,9 и т. Д. Вместо этого я хочу имя пользователя. как это сделать .я знаю об одном методе, то есть ключе use_natural_foriegn, но я не включил его в пользовательскую модель в этом, потому что я не знаю, как написать менеджер для пользовательской модели по умолчанию.Данные модели сообщений сохраняются в базе данных, я восстановил ее в формате json.как это решить. заранее спасибо

 "[{"model": "chat.message", "pk": 37, "fields": {"author": 10, "content": "hi", "timestamp": "2021-03-20T03:52:20.863Z"}}, {"model": "chat.message", "pk": 36, "fields": {"author": 11, "content": "abdullah", "timestamp": "2021-03-20T03:06:43.984Z"}}, {"model": "chat.message", "pk": 35, "fields": {"author": 9, "content": "hihjhjk", "timestamp": "2021-03-20T03:06:35.863Z"}}]"
 

Ответ №1:

Решаемая: используйте для этого фреймворк Django Rest, и я нахожу решение. просто создайте serializers.py и Серилизуйте вложенные модели таким образом

serilaizer.py

 from rest_framework import serializers
from chat.models import Message,User
from django.contrib.auth.models import User


class MessageSerializer(serializers.ModelSerializer):
        author = serializers.SlugRelatedField(queryset=User.objects.all(), 
        slug_field='username')
        class Meta:
            model=  Message
            fields = ('content','timestamp','author')
 

views.py
используйте представления @api фреймворка Django Rest в views.py.представление api похоже на представление функций в Django Rest Framework

 from django.core import serializers
from rest_framework.response import Response
from rest_framework.decorators import api_view 
@api_view(['GET'])
def getMessages(request):
    if request.method == 'GET':
        messages = Message.objects.all()
        serializer = MessageSerializer(messages, many=True)
        return Response(serializer.data)
 

urls.py

 from django.urls import path
from . import views
app_name = 'chat'

urlpatterns = [

    path('room/<int:id>/', views.course_chat_room,name='course_chat_room'),
    path('room/ajax/', views.getMessages,name='getMessages'),
    
]
 

* Это формат данных Json . это формат результата, который я хочу *

  [{"content":"hihjhjk","timestamp":"2021-03-20T03:06:35.863988Z","author":"admin2"},{"content":"abdullah","timestamp":"2021-03-20T03:06:43.984523Z","author":"jani"},{"content":"hi","timestamp":"2021-03-20T03:52:20.863204Z","author":"test"},{"content":"hi","timestamp":"2021-03-21T03:28:29.676668Z","author":"admin2"},{"content":"hi","timestamp":"2021-03-25T00:01:36.914211Z","author":"admin2"}]