При включении ресурсов DRF возвращает мои мягкие удаленные записи

У меня есть DRF API, который поддерживает включение книг автора в authors запрос get.

Наш API имеет систему мягкого удаления, где Книга(2) помечена как удаленная.

Но когда я делаю запрос ниже Книга(2) все еще включена в ответ.

Я бы хотел, чтобы в ответе на этот запрос была только Книга(1).

GET http://localhost/authors/2?include=books

API возвращает мне:

{
    "data": {
        "type": "Author",
        "id": "2",
        "attributes": {...},
        "relationships": {
            "books": {
                "meta": {
                    "count": 2
                },
                "data": [
                    {
                        "type": "Book",
                        "id": "1"
                    },
                    {
                        "type": "Book",
                        "id": "2"
                    }
                ]
            }
        }
    },
    "included": [
        {
            "type": "Book",
            "id": "1",
            "attributes": {...}
        },
        {
            "type": "Book",
            "id": "2",
            "attributes": {...}
        }
    ]
}

У меня есть BaseModel, который обрабатывает мягкое удаление, переопределяя метод delete:

class BaseModel(Model):
    archive = BoolYesNoField(db_column="archive", default=False, null=False)
    created = DateTimeField(db_column="created", auto_now_add=True, null=False)
    updated = DateTimeField(db_column="updated", auto_now=True, null=False)

    objects = BaseManager()
    all_objects = BaseManager(alive_only=False)

    def delete(self):
        self.archive = True
        self.save()
        relate_obj_delete(self)

    def hard_delete(self):
        super(Model, self).delete()

    def undelete(self):
        self.archive = False
        self.save()

Manager

class BaseManager(Manager):
    def __init__(self, *args, **kwargs):
        self.alive_only = kwargs.pop("alive_only", True)
        super(BaseManager, self).__init__(*args, **kwargs)

    def get_queryset(self):
        if self.alive_only:
            return BaseQuerySet(self.model).filter(archive=False)
        return BaseQuerySet(self.model)

    def hard_delete(self):
        return self.get_queryset().hard_delete()

AuthorViewSet

class AuthorViewSet(BaseViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer
    filterset_class = AuthorFilterSet

Сериализатор

class AuthorSerializer(BaseSerializer):
    books = ResourceRelatedField(many=True, read_only=True)
    included_serializers = {
        "books": BookSerializer,
    }

    class Meta(BaseSerializer.Meta):
        model = Author

Если бы кто-нибудь мог указать мне правильное направление, я бы очень помог. Возможно, где-то есть функция, которую мне нужно переопределить, но я не могу найти ее.

Ваша проблема в вашем сериализаторе. По умолчанию Django будет использовать Model._base_manager для получения связанных объектов, а не ваш пользовательский менеджер. Вам нужно указать во вложенном поле ResourceRelatedField, какой менеджер вы хотите использовать

class AuthorSerializer(BaseSerializer):
    books = ResourceRelatedField(
        queryset=Book.objects,
        many=True,
        read_only=True
    )
    ...
Вернуться на верх