Как получить и ID, и имена из поля Many to Many в Django
Я создаю приложение для обмена сообщениями, как Whatsapp. У меня есть модель профиля, в которой есть комнаты как отношение "многие ко многим". То есть у каждого пользователя будет список комнат, в которые он добавлен в базе данных профиля. Я использую Rest Framework для получения информации о комнатах. Я получаю только ID комнат каждый раз, когда я получаю информацию из API. Но было бы намного проще и оптимизированнее для моего приложения, если бы я мог также получать имена комнат и ID через Api профиля, в котором есть комнаты как отношение "многие ко многим". Как я могу сохранить оба поля Name & id в поле Many to Many?
#model.py
from django.db import models
# Create your models here.
class Room(models.Model):
name = models.CharField(max_length=100,unique=True,blank=True,null=True)
def __str__(self):
return self.name
class Profile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
rooms = models.ManyToManyField(Room)
def __str__(self):
return self.user.username
Serializers.py
from django.contrib.auth.models import User
from rest_framework import serializers
from App.models import *
class roomSerializer(serializers.ModelSerializer):
class Meta:
model = Room
fields = '__all__'
class userSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class profileSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
fields = '__all__'
views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from App.models import *
from .serializers import *
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['name'] = user.username
# ...
return token
class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer
@api_view(['GET','POST'])
def GetRoomData(request):
if request.method=='GET':
rooms = Room.objects.all()
serializer = roomSerializer(rooms,many=True)
if request.method == 'POST':
serializer = roomSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
@api_view(['GET'])
def getUserData(request):
profile = User.objects.all()
serializer = userSerializer(profile,many=True)
return Response(serializer.data)
@api_view(['GET','PUT'])
def getProfileData(request,pk):
if request.method == 'GET':
profile = Profile.objects.get(user=pk)
serializer = profileSerializer(profile)
if request.method=='PUT':
profile = Profile.objects.get(user=request.data['user'])
serializer = profileSerializer(profile, data=request.data)
if serializer.is_valid():
serializer.save()
else:
return Response(serializer.errors, status=400)
return Response(serializer.data)