Я пытаюсь создать 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))
]