Как их совместить?

Я выполняю упражнение, цель которого - сопоставить мой текущий календарь с другими пользователями. Для этого я создал приложение UserProfile и приложение Schedule. У каждого пользователя есть профиль, который может иметь несколько интервалов.

Рассматривая мой текущий календарь:

{
"count": 1,
"next": null,
"previous": null,
"results": [
    {
        "id": 3,
        "user": {
            "id": 3,
            "username": "john.doe",
            "first_name": "John",
            "last_name": "Doe"
        },
        "calendar": [
            {
                "id": 1,
                "mon": true,
                "tue": true,
                "wed": true,
                "thu": true,
                "fri": true,
                "sat": true,
                "sun": true,
                "start_date": "09:30",
                "end_date": "12:20"
            },
            {
                "id": 2,
                "mon": true,
                "tue": true,
                "wed": true,
                "thu": true,
                "fri": true,
                "sat": true,
                "sun": true,
                "start_date": "14:00",
                "end_date": "23:00"
            }
        ]
    }
]

}

Когда я делаю вызов конечной точки /api/search/users она возвращает все профили пользователей с информацией по каждому пользователю.

пример:

{
"count": 99,
"next": "http://localhost:8000/api/search/users?page=2",
"previous": null,
"results": [
    {
        "id": 1,
        "user": {
            "id": 1,
            "username": "john.bender.99",
            "first_name": "John",
            "last_name": "Bender"
        },
        "calendar": [
            {
                "id": 2,
                "mon": true,
                "tue": true,
                "wed": true,
                "thu": false,
                "fri": true,
                "sat": false,
                "sun": false,
                "start_date": "09:30",
                "end_date": "12:20"
            },
            {
                "id": 55,
                "mon": false,
                "tue": true,
                "wed": true,
                "thu": false,
                "fri": true,
                "sat": false,
                "sun": false,
                "start_date": "14:30",
                "end_date": "19:20"
            }
        ]
    }
]

}

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

Когда я делаю вызов этой конечной точки /api/search/users?related=self, я хочу видеть следующее

{
"count": 2,
"results": [
    {
        "id": 87,
        "user": {
            "id": 87,
            "username": "diana.taller",
            "first_name": "Diana",
            "last_name": "Taller"
        },
        "calendar": [
            {
                "id": 2,
                "mon": true,
                "tue": true,
                "wed": true,
                "thu": false,
                "fri": true,
                "sat": false,
                "sun": false,
                "start_date": "10:30",
                "end_date": "11:20"
            },
            {
                "id": 55,
                "mon": false,
                "tue": true,
                "wed": true,
                "thu": false,
                "fri": true,
                "sat": false,
                "sun": false,
                "start_date": "16:30",
                "end_date": "17:20"
            }
        ]
    },{
        "id": 128,
        "user": {
            "id": 128,
            "username": "therockjosh",
            "first_name": "Josh",
            "last_name": "Bail"
        },
        "calendar": [
            {
                "id": 2,
                "mon": false,
                "tue": false,
                "wed": false,
                "thu": false,
                "fri": true,
                "sat": false,
                "sun": false,
                "start_date": "10:30",
                "end_date": "11:20"
            },
            {
                "id": 55,
                "mon": false,
                "tue": false,
                "wed": false,
                "thu": false,
                "fri": true,
                "sat": true,
                "sun": true,
                "start_date": "14:30",
                "end_date": "17:00"
            }
        ]
    }
]

}

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

Внутри моего приложения Search App я создал следующее

        if related == "self":
        current_user_profile = UserProfile.objects.filter(user=self.request.user)
        related_users = UserProfile.objects.filter(calendar__in=current_user_profile.calendar.all())

        return related_users

queryset attribute calendar

Если я вызываю current_user_profile, возвращает мне данные текущего пользователя, как я предоставлял вам ранее. Если я вызываю UserProfile.objects.all(), возвращает мне данные пользователя, как я предоставил вам ранее.

Но по какой-то причине я не могу вызвать календарь из current_user_profile.calendar, как показано на этом изображении.

Есть ли у кого-нибудь идеи, как я могу это сделать? Спасибо.

Думаю, вам нужно использовать функцию get, если вы хотите получить объект.

if related == "self":
    # not UserProfile.objects.filter in order to get the UserProfile object.
    current_user_profile = UserProfile.objects.get(user=self.request.user)
    related_users = UserProfile.objects.filter(calendar__in=current_user_profile.calendar.all())

    return related_users

Вот решение, которое я нашел, чтобы исключить моего пользователя из поиска.

    current_user_profile = UserProfile.objects.get(user=self.request.user)
    related_users = UserProfile.objects\
        .filter(calendar__in=current_user_profile.calendar.all()) \
        .exclude(user_id=current_user_profile.id)

    return related_users
Вернуться на верх