I am developing one project, my responsibility is that I have to return single or multiple members based on the searching criteria from the single project. Here is my models:
class Project(BaseModel):
# BaseModel is a abstract base class has (created, updated) model fields
user = models.ManyToManyField(User)
name = models.CharField(max_length=100)
deadline = models.DateField()
def __str__(self):
return self.name
My serializers:
class ProjectListSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(
view_name='team-detail',
lookup_field='pk'
)
class Meta:
model = Project
fields = ['url', 'name',]
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = ['user', 'name']
def to_representation(self, instance):
self.fields['user'] = UserListSerializer(many=True)
return super(ProjectSerializer, self).to_representation(instance)
My urls:
urlpatterns = [
path('', ProjectListAPIView.as_view()),
path('<int:pk>/', ProjectDetailAPIView.as_view(), name='team-detail')
]
My views:
class ProjectListAPIView(generics.ListAPIView):
queryset = Project.objects.all()
serializer_class = ProjectListSerializer
class ProjectDetailAPIView(generics.RetrieveAPIView):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
search_fields = ['user__username', 'user__first_name', 'user__last_name', 'user__position__position']
ProjectListAPIView returns:
[
{
"url": "http://127.0.0.1:8000/api/v1/teams/1/",
"name": "Project 1"
},
{
"url": "http://127.0.0.1:8000/api/v1/teams/2/",
"name": "Project 2"
},
{
"url": "http://127.0.0.1:8000/api/v1/teams/3/",
"name": "Project 3"
}
]
When I enter any of the link(project-detail, ProjectDetailAPIView view), it looks:
{
"user": [
{
"url": "http://127.0.0.1:8000/api/v1/user/2/",
"first_name": "John",
"last_name": "Doe",
"position": [
{
"id": 1,
"created_datetime": "2022-09-20T15:07:59.388507+05:00",
"modified_datetime": "2022-09-20T15:07:59.388523+05:00",
"position": "Manager"
}
],
"image": {
"id": 1,
"file": "http://127.0.0.1:8000/media/2022/9/20/6e60d24d-0c25-41fc-8cb4-4c73ff05ac59.jpg",
"format": "jpg",
"name": "my image",
"ordering": 1
},
"work_type": "At office"
},
{
"url": "http://127.0.0.1:8000/api/v1/user/3/",
"first_name": "Jeremy",
"last_name": "Renner",
"position": [
{
"id": 3,
"created_datetime": "2022-09-20T15:08:09.938389+05:00",
"modified_datetime": "2022-09-20T15:08:09.938405+05:00",
"position": "Backend Engineer"
},
{
"id": 5,
"created_datetime": "2022-09-20T15:08:17.334595+05:00",
"modified_datetime": "2022-09-20T15:08:17.334612+05:00",
"position": "Project Manager"
}
],
"image": {
"id": 2,
"file": "http://127.0.0.1:8000/media/2022/9/20/7e3f29ee-0a9a-4aa6-84a2-84afac806e24.png",
"format": "png",
"name": "my photo",
"ordering": 2
},
"work_type": "Remote"
},
{
"url": "http://127.0.0.1:8000/api/v1/user/4/",
"first_name": "Tom",
"last_name": "Hiddleston",
"position": [
{
"id": 4,
"created_datetime": "2022-09-20T15:08:13.660684+05:00",
"modified_datetime": "2022-09-20T15:08:13.660699+05:00",
"position": "Mobile Engineer"
}
],
"image": {
"id": 3,
"file": "http://127.0.0.1:8000/media/2022/9/20/686554ba-c030-466c-8953-a312c532abf2.jpg",
"format": "jpg",
"name": "my profile photo",
"ordering": 4
},
"work_type": "Absent"
}
],
"name": "Project 1"
}
I have to search members inside single project.