Я пытаюсь создать API управления проектами

На самом деле у меня много проблем здесь, я собираюсь перечислить некоторые из них Я использую django rest framework для создания Project Management API У меня есть 3 конечные точки Проекты, задачи, группы

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

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

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

вот моя модель

    class Project(models.Model):
    """
    here we have all projects data and the owner of the project we can add more fields .
    """
    created = models.DateTimeField(auto_now_add=True,blank=False) #the time of creating the project
    title = models.CharField(max_length=100, blank=False, default='') # project title
    owner = models.ForeignKey('auth.User', related_name='projects', on_delete=models.CASCADE) # project owner
    class Meta:
        # we order with the new one
        ordering = ('-created', )

    def __str__(self):
        return self.title

class Task(models.Model):
    """
    Task table here we create a relation ''
    """
    title = models.CharField(max_length=100, blank=False, default='')
    project = models.ForeignKey('Project',related_name='tasks',on_delete=models.CASCADE)
    owner = models.ForeignKey('auth.User',related_name='tasks',on_delete=models.CASCADE)
    start = models.DateTimeField(auto_now=False)
    end = models.DateTimeField(auto_now=False)
    desc = models.TextField(blank=True)
    complete = models.BooleanField(default=False)

class Group(models.Model):
    title = models.CharField(max_length=100,blank=False,default='')
    project = models.ForeignKey('Project',related_name='groups',on_delete=models.CASCADE)
    owner = models.ForeignKey('auth.User',related_name='group',on_delete=models.CASCADE)
    member = models.ManyToManyField('auth.User',related_name='group_members')
    created = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    def __str__(self):
        return self.title
    def get_member(self):
        return "\n".join([p.member for p in self.member.all()])

вот мои сериализаторы

    from django.contrib.auth.models import User
from rest_framework import serializers
from django.contrib.auth.hashers import make_password
from .models import Project , Task , Group

class ProjectSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    tasks = serializers.HyperlinkedRelatedField(many=True, view_name='task-detail', read_only=True)
    groups = serializers.HyperlinkedRelatedField(many=True, view_name='group-detail', read_only=True)

    class Meta:
        model = Project
        fields = ['url', 'id','owner', 'title','created','tasks','groups']


class TaskSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    start =  serializers.DateTimeField(format=None,input_formats=None)
    end =  serializers.DateTimeField(format=None,input_formats=None)


    class Meta:
        model = Task
        fields = ['url','project_id', 'id','owner','title','start','end','desc','project','complete']

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    class Meta:
        model = Group
        fields = ('url','title','owner','member','created','active','project',)

class UserSerializer(serializers.HyperlinkedModelSerializer):
    projects = serializers.HyperlinkedRelatedField(many=True, view_name='project-detail', read_only=True)
    tasks = serializers.HyperlinkedRelatedField(many=True, view_name='task-detail', read_only=True)
    group = serializers.HyperlinkedRelatedField(many=True, view_name='group-detail', read_only=True)
    member = serializers.ReadOnlyField(source='member.username')
    password = serializers.CharField(
        write_only=True,
        required=True,
        help_text='Leave empty if no change needed',
        style={'input_type': 'password', 'placeholder': 'Password'}
    )
    class Meta:
        model = User
        fields = ['url','id','username','password','first_name', 'last_name', 'email', 'projects','tasks','group','member']

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data.get('password'))
        return super(UserSerializer, self).create(validated_data)

вот мое мнение

    from django.contrib.auth.models import User
from rest_framework import permissions, renderers, viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from itertools import chain
from django_filters.rest_framework import DjangoFilterBackend
from .models import Project , Task , Group
from .permissions import IsOwnerOrReadOnly ,  IsMemberOrReadOnly
from .serializers import ProjectSerializer, UserSerializer,TaskSerializer , GroupSerializer
from rest_framework.decorators import action
from django.db.models import Q
from itertools import chain

class ProjectViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """

    queryset = Project.objects.all()
    serializer_class = ProjectSerializer
    permission_classes = (
        permissions.IsAuthenticated,)

    def get_queryset(self):
        queryset = self.queryset
        query_set = queryset.filter(owner=self.request.user)
        return query_set

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)


class TaskViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """
    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    permission_classes = (
        permissions.IsAuthenticated,
        IsOwnerOrReadOnly,  )

    def get_queryset(self):
        queryset = self.queryset
        query_set = queryset.filter(owner=self.request.user)
        return query_set


    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class GroupViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = (
        permissions.IsAuthenticated,)
    def get_queryset(self):
        queryset = self.queryset
        query_set = queryset.filter(owner=self.request.user)
        query_set1 = queryset.filter(member=self.request.user)

        return(list(query_set) +  list(query_set1))


    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)


class UserViewSet(viewsets.ModelViewSet):
    """
    This viewset automatically provides `list` and `detail` actions.
    """
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (
        permissions.AllowAny , )

    def get_queryset(self):
        queryset = self.queryset
        query_set = queryset.filter( username=self.request.user)

        return query_set

вот мой url

    from django.conf.urls import include, re_path
from rest_framework.routers import DefaultRouter

from project import views

# Create a router and register our viewsets with it.
router = DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'projects', views.ProjectViewSet)
router.register(r'tasks', views.TaskViewSet)
# router.register(r'member', views.MemberViewSet)
router.register(r'groups', views.GroupViewSet,basename='group-detail')

# The API URLs are now determined automatically by the router.
# Additionally, we include the login URLs for the browsable API.
urlpatterns = [
    re_path(r'^', include(router.urls))
]
Вернуться на верх