Создание моделей и сериализаторов для полей ManytoMany и foriegn - django
Я новичок в Django и пытаюсь создать REST API для следующей проблемы:
Пользователь добавит навыки в свой профиль, а другие пользователи могут добавить его в свой профиль.
После обучения за последний месяц я могу создать сеанс аутентификации JWT для добавления навыков (HTTP GET и POST). Затем я запутался в том, как настроить свои сериализаторы и представления для таких операций, как добавление навыков в профиль пользователя и получение голосов против него.
У меня есть следующие Model и View готовы и протестированы:
#import from django models module
from django.db import models
# This class will more or less map to a table in the database and defines skills at the application level
class Skill (models.Model):
# this defines a required name that cannot be more than 100 characters.
skill_name = models.CharField(max_length=100,unique=True)
class Meta:
app_label = "wantedly_webapp"
# This class will more or less map to a table in the database and defines the many to many relationship between user-skill, this is our intermediate model
class UserSkill(models.Model):
""" A Model for representing skill in user profile """
unique_together = (('user', 'skill_item'),)
user = models.ForeignKey('UserProfile',on_delete=models.CASCADE,related_name='all_user_skills')
skill_item = models.ForeignKey(
Skill,
on_delete=models.CASCADE
)
def __str__(self):
"""Return a human readable representation of the model instance."""
return "{}".format(self.skill_item.skill_name)
# this class adds a Many to Many field in existing django-rest auth UserProfile class for user and his/her skills
class UserProfile(models.Model):
user = models.OneToOneField('auth.User',unique=True,on_delete=models.CASCADE,related_name='user_profile')
user_skills = models.ManyToManyField(
Skill,
through='UserSkill',
through_fields=('user','skill_item')
)
class UserSkillUpvotes(models.Model):
unique_together = (('user_skill', 'upvote_by'),)
user_skill = models.ForeignKey('UserSkill',on_delete=models.CASCADE)
upvote_by = models.ForeignKey('auth.User',on_delete=models.CASCADE , related_name='all_upvote_by_user')
upvote_for = models.ForeignKey('auth.User',on_delete=models.CASCADE , related_name='all_upvote_for_user')
My Views :
@api_view(['GET','POST'],)
def skill_collection(request):
if request.method == 'GET':
skills = Skill.objects.all()
serializer = SkillSerializer(skills, many=True)
return Response(serializer.data)
elif request.method == 'POST':
data = { 'skill_name': request.data.get('skill_name')}
serializer = SkillSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response({serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'DELETE' ])
def skill_element(request, pk):
try:
skill = Skill.objects.get(pk=pk)
except Skill.DoesNotExist:
return HttpResponse(status=404)
if request.method == 'GET':
serializer = SkillSerializer(skill)
return Response(serializer.data)
elif request.method == 'DELETE':
skill.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
@api_view(['GET','POST','DELETE'],)
def user_skill_collection(request):
#todo add / get /delete a skill to user profile
Далее я хочу создать представления о том, как я могу добавить / удалить существующий навык в существующий профиль пользователя.