#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"}]