Создание моделей и сериализаторов для полей 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

Далее я хочу создать представления о том, как я могу добавить / удалить существующий навык в существующий профиль пользователя.

0 ответов

Другие вопросы по тегам