def find(cls, id='', user=None, project=None):
        """
        Like :py:meth:`.PanoptesObject.find` but can also query by user and
        project.

        - **user** and **project** can be either a :py:class:`.User` and
          :py:class:`.Project` instance respectively, or they can be given as
          IDs. If either argument is given, the other is also required.
        """

        if not id:
            if not (user and project):
                raise ValueError('Both user and project required')
            if (
                isinstance(user, User)
                and isinstance(project, Project)
            ):
                _user_id = user.id
                _project_id = project.id
            elif (
                isinstance(user, (int, str,))
                and isinstance(project, (int, str,))
            ):
                _user_id = user
                _project_id = project
            else:
                raise TypeError
            id = cls.where(user_id=_user_id, project_id=_project_id).next().id
        return super(ProjectPreferences, cls).find(id)