Searching specific fields of multiple rows from single relational row in drf

Viewed 10

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.

0 Answers
Related