Реклама

Выпуск Django 2.0

Django, Releases

Команда Django анонсировала выпуск Django 2.0

Этот выпуск начинается с использования в Django свободной формы семантического управления версиями, но нет существенных изменений в обратной совместимости (за исключением того, что был удалён Python 2.7), что было ожидаемым в выпуске 2.0. Обновление должно быть таким же, как и для предыдущих выпусков.

Примечания к выпуску

Совместимость с Python

Django 2.0 поддерживает следующие версии Python: 3.4, 3.5 и 3.6. Разработчики Django настоятельно рекомендуют именно эти версии и официально поддерживают только последнии версии данных версионных серий Python.

Django 1.11.x является последней версией, которая поддерживает Python 2.7

Django 2.0 станет последней версией с поддержкой Python 3.4. Если вы планируете развертывание Python 3.4 до конца срока службы для Django 2.0 (апрель 2019 года), то используйте Django 1.11 LTS (поддерживаемый до апреля 2020 года). Обратите внимание, однако, что конец поддержки Python 3.4 - конец марта 2019 года.

Поддержка третьесторонних библиотек для старых версий Django

После выпуска Django 2.0 Разработчики предлагают сторонним разработчикам приложений отказаться от поддержки всех версий Django до 1.11. В тоже время разработчики должны иметь возможность запускать тесты своего пакета с помощью python -Wd , чтобы отображались предупреждения об ошибках. После внесения исправлений для предупреждения об ошибке приложение должно быть совместимо с Django 2.0.

Что нового в Django 2.0?

Упрощенный синтаксис маршрутизации URL-адресов

Новая функция django.urls.path() позволяет упростить синтаксис url-адресов, и сделать его более читаемым. Например, этот пример из предыдущих выпусков Django:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

Может быть написан следующим образом

path('articles/<int:year>/', views.year_archive),

Новый синтаксис поддерживает тип принуждения параметров URL. В этом примере представление будет принимать аргумент ключевого слова year как целое число, а не как строку. Кроме того, URL-адреса не будут теперь так ограничены, поскольку year передаётся в качестве целочисленного значения, то, например, год 10000 теперь будет соответствовать, поскольку целые числа года не ограничены четырьмя цифрами, так как если бы они находились в регулярном выражении.

Функция django.conf.urls.url() из предыдущих версий теперь доступна как django.urls.re_path() . Старое местоположение остается для обратной совместимости. Старая функция django.conf.urls.include() теперь импортируется из django.urls , поэтому вы можете использовать её как from django.urls import include, path, re_path в ваших URL-адресах.

Mobile-friendly contrib.admin

Теперь панель администрирования поддерживает все основные мобильные устройства. Старые браузеры могут испытывать различные уровни деградации.

Window expressions

Новое выражение Window позволяет добавить OVER к запросам. Вы можете использовать функции окна и агрегатные функции в выражении.

Минорный функционал

django.contrib.admin

  • Новые ModelAdmin.autocomplete_fields аттрибут и метод ModelAdmin.get_autocomplete_fields() позволяют использовать Select2 поисковый виджет для ForeignKey и ManyToManyField .

django.contrib.auth

  • Счетчик итераций по умолчанию для шифровальщика пароля PBKDF2 увеличен с 36 000 до 100 000.

django.contrib.gis

  • Добавлена поддержка MySQL для функции AsGeoJSON , функции GeoHash , функции IsValid , поиска isvalid и поиска расстояний.
  • Добавлены функции Azimuth и LineLocatePoint , поддерживаемые PostGIS и SpatiaLite .
  • Любая GEOSGeometry , импортированная из GeoJSON , теперь имеет свой набор SRID .
  • Добавлен атрибут OSMWidget.default_zoom , чтобы настроить масштаб изображения по умолчанию.
  • Сделаны метаданные, читаемые и редактируемые на растрах через атрибуты метаданных, информации и метаданных.
  • Разрешено передавать параметры создания конкретного драйвера для объектов GDALRaster с помощью papsz_options .
  • Разрешено создавать объекты GDALRaster во внутренней виртуальной файловой системе GDAL . Теперь Rasters можно создавать и преобразовывать в двоичные данные в памяти.
  • Новый метод GDALBand.color_interp() возвращает интерпретацию цвета для полосы.

django.contrib.postgres

  • Новый distinct аргумент для ArrayAgg определяет, будут ли объединенные значения различными.
  • Новая функция базы данных RandomUUID возвращает UUID версии 4. Для этого требуется использование расширения pgcrypto PostgreSQL , которое можно активировать с помощью новой операции миграции CryptoExtension .
  • django.contrib.postgres.indexes.GinIndex теперь поддерживает параметры fastupdate и gin_pending_list_limit .
  • Новый класс GistIndex позволяет создавать индексы GiST в базе данных. В новой операции миграции BtreeGistExtension устанавливается расширение btree_gist , чтобы добавить поддержку классов операторов, которые не встроены.
  • inspectdb теперь может использовать JSONField и различные RangeFields ( django.contrib.postgres должен быть в INSTALLED_APPS ).

django.contrib.sitemaps

  • Добавлен аргумент ключевого слова protocol в конструктор GenericSitemap .

Cache

  • cache.set_many() теперь возвращает список ключей, которые не были вставлены. Для встроенных бэкендов неудачные вставки могут произойти только на memcached .

File Storage

  • File.open() может использоваться как менеджер контекста, например. с file.open() как f: .

Forms

  • Новые аргументы date_attrs и time_attrs для SplitDateTimeWidget и SplitHiddenDateTimeWidget позволяют указывать различные атрибуты HTML для подвиджетов DateInput и TimeInput (или скрытых).
  • Новый метод Form.errors.get_json_data() возвращает ошибки формы в качестве словаря, подходящего для включения в ответ JSON.

Generic Views

  • Новый атрибут ContextMixin.extra_context позволяет добавить контекст в View.as_view() .

Management Commands

  • inspectdb теперь переводит беззнаковые целые столбцы MySQL в PositiveIntegerField или PositiveSmallIntegerField .
  • Новая опция makemessages --add-location определяет формат комментария в файлах PO.
  • loaddata теперь может читать из stdin .
  • Новая опция diffsettings - output позволяет форматировать вывод в унифицированном формате diff .
  • В Oracle инспекция теперь может рассматривать AutoField , если столбец создан как столбец идентификатора.
  • В MySQL dbshell теперь поддерживает клиентские TLS-сертификаты.

Migrations

  • Новая опция squashmigrations --squashed-name позволяет именовать сжатую миграцию.

Models

  • Новая функция базы данных StrIndex находит начальный индекс строки внутри другой строки.
  • В Oracle, AutoField и BigAutoField теперь создаются как столбцы идентификации.
  • Новый параметр chunk_size QuerySet.iterator() управляет количеством строк, выбранных клиентом базы данных Python при потоковой передаче результатов из базы данных. Для баз данных, которые не поддерживают серверные курсоры, он контролирует количество результатов, полученных Django из адаптера базы данных.
  • QuerySet.earliest() , QuerySet.latest() и Meta.get_latest_by теперь позволяют упорядочивать несколько полей.
  • Добавлена функция ExtractQuarter для извлечения квартала из DateField и DateTimeField .
  • Добавлена функция TruncQuarter для обрезания DateField и DateTimeField в первый день квартала.
  • Добавлен параметр db_tablespace для индексов класса.
  • Если база данных поддерживает собственное поле продолжительности ( Oracle и PostgreSQL ), Extract теперь работает с DurationField .
  • Добавлен аргумент QuerySet.select_for_update(), поддерживаемый PostgreSQL и Oracle , для блокировки только строк из определенных таблиц, а не всех выбранных таблиц. Это может быть полезно, особенно если select_for_update() используется в сочетании с select_related() .
  • Новый параметр field_name QuerySet.in_bulk() позволяет получать результаты на основе любого уникального поля модели.
  • CursorWrapper.callproc() теперь использует необязательный словарь параметров ключевого слова, если бэкэнд поддерживает эту функцию. Встроенные серверы Django поддерживают только Oracle.
  • Новый метод connection.execute_wrapper() позволяет устанавливать обёртки вокруг выполнения запросов к базе данных.
  • Новый аргумент фильтра для встроенных агрегатов позволяет добавлять различные условные обозначения в несколько агрегатов по тем же полям или отношениям.
  • Добавлена поддержка выражений в Meta.ordering .
  • Новый именованный параметр QuerySet.values_list() позволяет получать результаты как именованные кортежи.
  • Новый класс FilteredRelation позволяет добавить ON к запросам.

Pagination

  • Добавлен Paginator.get_page() , чтобы обеспечить документированный шаблон обработки недопустимых номеров страниц.

Запросы и ответы

  • Метод runserver для Веб-серверa  поддерживает HTTP 1.1.

Templates

  • Чтобы повысить полезность Engine.get_default() в сторонних приложениях, теперь он возвращает первый движок, если несколько механизмов DjangoTemplates сконфигурированы в TEMPLATES вместо того, чтобы выбрасывать NotperlyConfigured .
  • Пользовательские теги шаблонов теперь могут принимать аргументы только для ключевого слова.

Tests

  • Добавлена поддержка потоковой передачи LiveServerTestCase .
  • Добавлены настройки, которые позволяют настраивать параметры тестового табличного пространства для Oracle: DATAFILE_SIZE , DATAFILE_TMP_SIZE , DATAFILE_EXTSIZE и DATAFILE_TMP_EXTSIZE .

Validators

  • Новый ProhibitNullCharactersValidator запрещает нулевой символ во вводе поля формы CharField и его подклассов. Нулевой ввод символов наблюдался из инструментов сканирования уязвимостей. Большинство баз данных молча отбрасывают нулевые символы, но psycopg2 2.7+ создает исключение при попытке сохранить нулевой символ в поле char / text с PostgreSQL .

Изменения без обратной совместимости в 2.0

В некоторых местах удалена поддержка bytestrings

Чтобы поддерживать собственные строки Python 2, более старые версии Django должны были принимать как байты, так и строки unicode. Теперь, когда поддержка Python 2 отбрасывается, байты должны встречаться только вокруг границ ввода / вывода (например, обработка двоичных полей или потоков HTTP). Возможно, вам придется обновить свой код, чтобы ограничить использование байтов до минимума, поскольку Django больше не принимает байты в определенных кодах.

Например, reverse() теперь использует str() вместо force_text() для принуждения аргументов и kwargs , которые он получает, до их размещения в URL-адресе. Для байтов, это создает строку с нежелательным префиксом b, а также дополнительные кавычки (str (b'foo ') - «b'foo») . Чтобы адаптироваться, вызовите decode() в байтовой последовательности, прежде чем передавать его в reverse() .

Database backend API

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

  • Методы DatabaseOperations.datetime_cast_date_sql() , datetime_cast_time_sql() , datetime_trunc_sql() , datetime_extract_sql() и date_interval_sql() теперь возвращают только SQL для выполнения операции вместо SQL и список параметров.
  • Сторонние базы данных базы данных должны добавить атрибут DatabaseWrapper.display_name с именем базы данных, с которой работает ваш бэкэнд. Django может использовать его в различных сообщениях, например, в системных проверках.
  • Первый аргумент SchemaEditor._alter_column_type_sql() теперь является моделью, а не таблицей.
  • Первый аргумент SchemaEditor._create_index_name() теперь является table_name , а не моделью.
  • Чтобы включить FOR UPDATE поддержку, установите DatabaseFeatures.has_select_for_update_of = True . Если база данных требует, чтобы аргументы OF были столбцами, а не таблицами, установите DatabaseFeatures.select_for_update_of_column = True .
  • Чтобы включить поддержку выражений Window , установите для параметра DatabaseFeatures.supports_over_clause значение True . Возможно, вам придется настроить методы DatabaseOperations.window_start_rows_start_end() и / или window_start_range_start_end() .
  • Сторонние базы данных базы данных должны добавить атрибут DatabaseOperations.cast_char_field_without_max_length с типом данных базы данных, который будет использоваться в функции Cast для CharField , если аргумент max_length не указан.
  • Первый аргумент DatabaseCreation._clone_test_db() и get_test_db_clone_settings() теперь является суффиксом, а не числом (в случае, если вы хотите переименовать подписи в своем сервере для согласованности). Теперь django.test передает эти значения как строки, а не как целые числа.
  • Сторонние базы данных базы данных должны добавить метод DatabaseIntrospection.get_sequences() на основе заглушки в BaseDatabaseIntrospection .

Отброшена поддержка Oracle 11.2

Окончание поддержки по восходящей линии для Oracle 11.2 - декабрь 2020 года. Django 1.11 будет поддерживаться до апреля 2020 года, который почти достигнет этой даты. Django 2.0 официально поддерживает Oracle 12.1+.

Уровень изоляции MySQL по умолчанию read committed

Уровень изоляции MySQL по умолчанию, повторяемое чтение, может привести к потере данных при типичном использовании Django. Чтобы предотвратить это и для согласованности с другими базами данных, уровень изоляции по умолчанию теперь read committed. Вы можете использовать параметр DATABASES для использования другого уровня изоляции, если это необходимо.

AbstractUser.last_name max_length увеличен до 150

Включена миграция для django.contrib.auth.models.User.last_name. Если у вас есть пользовательская модель, наследующая от AbstractUser, вам необходимо создать и применить миграцию базы данных для вашей модели пользователя.

Если вы хотите сохранить ограничение на 30 символов для фамилий, используйте пользовательскую форму:

from django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
    last_name = forms.CharField(max_length=30, required=False)

Если вы хотите сохранить это ограничение в админе при редактировании пользователей, установите UserAdmin.form для использования этой формы:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

QuerySet.reverse() и last() запрещены после slicing

Вызов QuerySet.reverse() или last() на фрагментированном наборе запросов приводит к неожиданным результатам из-за того, что срез применяется после переупорядочения. Это запрещено, например:

>>> Model.objects.all()[:2].reverse()
Traceback (most recent call last):
...
TypeError: Cannot reverse a query once a slice has been taken.

Поля формы больше не принимают необязательные аргументы в качестве позиционных аргументов

Чтобы предотвратить ошибки времени выполнения из-за неправильного упорядочения аргументов поля формы, необязательные аргументы встроенных полей формы больше не принимаются в качестве позиционных аргументов. Например:

forms.IntegerField(25, 10)

вызывает исключение и заменяется на:

forms.IntegerField(max_value=25, min_value=10)

call_command() проверяет параметры, которые она получает

Теперь call_command() проверяет, что парсер аргументов вызываемой команды определяет все параметры, переданные в call_command().

Для пользовательских команд управления, которые используют параметры, не созданные с помощью parser.add_argument() , добавьте в команду атрибут stealth_options :

class MyCommand(BaseCommand):
    stealth_options = ('option_name', ...)

Индексы больше не принимают позиционные аргументы

Например:

models.Index(['headline', '-pub_date'], 'index_name')

вызывает исключение и заменяется на:

models.Index(fields=['headline', '-pub_date'], name='index_name')

Ограничения внешнего ключа теперь включены в SQLite

Это будет отображаться как обратное-несовместимое изменение (ограничение целостности IntegrityError: FOREIGN KEY) при попытке сохранить существующий экземпляр модели, нарушающий ограничение внешнего ключа.

Внешние ключи теперь создаются с DEFERRABLE INITIALLY DEFERRED вместо DEFERRABLE IMMEDIATE. Таким образом, таблицы, возможно, потребуется перестроить для воссоздания внешних ключей с новым определением, особенно если вы используете такой шаблон:

from django.db import transaction

with transaction.atomic():
    Book.objects.create(author_id=1)
    Author.objects.create(id=1)

Если вы не воссоздаете внешний ключ как DEFERRED, первый create() завершится ошибкой, если будут применены ограничения внешнего ключа.

Сначала создайте резервную копию базы данных! После обновления до Django 2.0 вы можете перестроить таблицы, используя скрипт, подобный этому:

from django.apps import apps
from django.db import connection

for app in apps.get_app_configs():
    for model in app.get_models(include_auto_created=True):
        if model._meta.managed and not (model._meta.proxy or model._meta.swapped):
            for base in model.__bases__:
                if hasattr(base, '_meta'):
                    base._meta.local_many_to_many = []
            model._meta.local_many_to_many = []
            with connection.schema_editor() as editor:
                editor._remake_table(model)

Этот скрипт не получил широкого тестирования и нуждается в адаптации для различных случаев, таких как несколько баз данных. Не стесняйтесь вносить улучшения.

Кроме того, из-за ограничения на изменение таблицы SQLite запрещается выполнять операции RenameModel и RenameField для моделей или полей, на которые ссылаются другие модели в транзакции. Чтобы разрешить миграции, содержащие эти операции, вы должны установить для атрибута Migration.atomic значение False.

Разное

  • Класс SessionAuthenticationMiddleware удален. Он не обеспечивал функциональности, поскольку аутентификация сеанса безоговорочно включена в Django 1.10.
  • Обработчики ошибок HTTP по умолчанию (handler404 и т. Д.) Теперь являются вызывающими, а не пунктирными строками пути Python. Django поддерживает вызываемые ссылки, поскольку они обеспечивают лучшую производительность и возможность отладки.
  • RedirectView больше не отключает NoReverseMatch , если pattern_name не существует.
  • Когда USE_L10N выключен, FloatField и DecimalField теперь соблюдают DECIMAL_SEPARATOR и THOUSAND_SEPARATOR во время проверки. Например, с настройками, ввод «1.345» теперь преобразован в 1345 вместо 1.345.:
USE_L10N = False
USE_THOUSAND_SEPARATOR = True
DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = '.'
  • Подклассы AbstractBaseUser больше не требуются для реализации get_short_name() и get_full_name() . (Базовые реализации, которые поднимают NotImplementedError , удаляются.) Django.contrib.admin использует эти методы, если они реализованы, но не требуют их. Сторонние приложения, использующие эти методы, могут захотеть применить аналогичный подход.
  • Параметры формата FIRST_DAY_OF_WEEK и NUMBER_GROUPING теперь сохраняются как целые числа в выводах JavaScript и JSON i18n.
  • assertNumQueries() теперь игнорирует запросы конфигурации соединения. Раньше, если в тесте было открыто новое соединение с базой данных, эти запросы могли быть включены как часть countNumQueries() .
  • Размер по умолчанию тестового табличного пространства Oracle увеличивается с 20M до 50M, а размер автоэкстенда по умолчанию увеличивается с 10M до 25M.
  • Чтобы повысить производительность при потоковой передаче больших наборов результатов из базы данных, QuerySet.iterator() теперь извлекает 2000 строк за раз, а не 100. Старое поведение можно восстановить с помощью параметра chunk_size . Например:
Book.objects.iterator(chunk_size=100)
  • Предоставление неизвестных имен пакетов в аргументе пакетов в представлении JavaScriptCatalog теперь вызывает ValueError вместо молчания.
  • Первичный ключ экземпляра модели теперь появляется в методе модели .__ str __ () по умолчанию, например. Объект вопроса (1).
  • makemigrations теперь обнаруживает изменения в поле limit_choices_to параметра модели. Добавьте это в свои существующие миграции или примите автоматически сгенерированную миграцию для полей, которые ее используют.
  • Выполнение запросов, требующих автоматических пространственных преобразований, теперь вызывает NotImplementedError для MySQL вместо молчания с использованием не трансформированных геометрий.
  • django.core.exceptions.DjangoRuntimeWarning удаляется. Он использовался только в кеш-памяти в качестве промежуточного класса в наследовании CacheKeyWarning для RuntimeWarning .
  • Переименовано BaseExpression._output_field в поле output_field . Возможно, вам придется обновить пользовательские выражения.
  • В более старых версиях формы и формы объединяют свои медиа с виджетами Media, объединяя их. Объединение теперь пытается сохранить относительный порядок элементов в каждом списке. MediaOrderConflictWarning выдается, если заказ не может быть сохранен.
  • django.contrib.gis.gdal.OGRException удаляется. Это был псевдоним для GDALException с Django 1.8.
  • Поддержка GEOS 3.3.x отключена.
  • Способ выбора данных для GeometryField изменен для повышения производительности, а в необработанных SQL-запросах эти поля теперь должны быть завернуты в connection.ops.select .

Функционал, устаревший в версии 2.0

Контекстный аргумент Field.from_db_value() и Expression.convert_value()

Аргумент контекста Field.from_db_value() и Expression.convert_value() не используется, поскольку он всегда является пустым словарем. Сигнатура обоих методов теперь:

(self, value, expression, connection)

вместо:

(self, value, expression, connection, context)

Поддержка старой сигнатуры в пользовательских полях и выражениях сохраняется до Django 3.0.

Разное

  • Модуль django.db.backends.postgresql_psycopg2 устарел в пользу django.db.backends.postgresql . Это был псевдоним в Django 1.9. Это влияет только на код, который напрямую импортируется из модуля. Параметр DATABASES по-прежнему может использовать 'django.db.backends.postgresql_psycopg2' , хотя вы можете упростить это, используя имя 'django.db.backends.postgresql' , добавленное в Django 1.9.
  • django.shortcuts.render_to_response() устарел в пользу django.shortcuts.render() . render() принимает те же аргументы, за исключением того, что он также требует запроса.
  • Значение DEFAULT_CONTENT_TYPE устарело. Он не очень хорошо взаимодействует со сторонними приложениями и устарел, поскольку HTML5 в основном заменил XHTML .
  • HttpRequest.xreadlines() устарел в пользу итерации по запросу.
  • Аргумент ключевого слова field_name для QuerySet.earliest() и QuerySet.latest() устарел в пользу передачи имен полей в качестве аргументов. Напишите .earliest('pub_date') вместо .earliest(field_name = 'pub_date') .

Функционал, удаленный в версии 2.0

Также в Django 2.0 были удалены все функции, которые были помечены как устаревшие в версиях 1.9 и 1.10.

Реклама

Комментарии

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
  • JaJay
  • 17 декабря 2017 г. 5:16

C++ - Тест 002. Константы

  • Результат 58 баллов
  • Очки рейтинга -2
  • JaJay
  • 17 декабря 2017 г. 4:55

C++ - Тест 001. Первая программа и типы данных

  • Результат 93 баллов
  • Очки рейтинга 8
  • JaJay
  • 17 декабря 2017 г. 4:48

C++ - Тест 001. Первая программа и типы данных

  • Результат 66 баллов
  • Очки рейтинга -1
Последние комментарии
  • EVILEG
  • 7 декабря 2017 г. 9:47

Django - Урок 011. Добавление комментариев на сайт с Django

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

  • Bernar
  • 7 декабря 2017 г. 9:24

Django - Урок 011. Добавление комментариев на сайт с Django

есть визуальный пример ?

  • EVILEG
  • 6 декабря 2017 г. 11:30

Django - Урок 011. Добавление комментариев на сайт с Django

Да, так будет даже лучше, я на сайте уже обновил до такого вида код Вот это уже не нужно if request.method == 'POST': Поскольку Вы и так используете метод post, то есть эта про...

  • Bernar
  • 6 декабря 2017 г. 11:19

Django - Урок 011. Добавление комментариев на сайт с Django

сделал немного по другому class EArticleView(View): template_name = 'knowledge/article.html' comment_form = CommentForm def get(self, request, *args, **kwargs): ...

Сейчас обсуждают на форуме
  • EVILEG
  • 16 декабря 2017 г. 17:23

Пауза в многопоточности

QFuture, который возвращается QtConcurrent::map имеет методы pause() и resume() и теоретически должен поддерживать этот функционал. Но для Qt...

  • Миша
  • 15 декабря 2017 г. 11:26

Как найти в QVector макс и мин

Спасибо

  • Galant
  • 14 декабря 2017 г. 19:58

LPT

Понял! Спасибо!

  • EVILEG
  • 14 декабря 2017 г. 13:38

QCustomPlot можно ли построить прерывистую линию на одном графике?

Во-первых: В pro файле проект по идее достаточно указать следующий define для включения возможности рендеринга через OpenGL DEFINES += QCUSTOMPLOT_USE_OPENGL И во вторых:...

  • EVILEG
  • 13 декабря 2017 г. 8:05

В многопоточности выполнять действие только в одном из потоков

Статическиe методs QThread::currentThread(); и QThread::currentThreadId() могут возвращать указатель на поток и его handle id соответственно. Можете попробовать через как...