Я настоятельно рекомендую превратить worker
в ForeignKey
, например, ссылаясь на поле username
модели User
:
from django.conf import settings
class Design(models.Model):
human_readable_id = models.CharField(max_length=10, default=id_generator, db_index=True)
manager = models.CharField(max_length=40)
worker = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
<b>to_field='username'</b>
)
Это означает, что worker_id
будет поле VARCHAR
с ограничением FOREIGN KEY
для столбца username
таблицы auth_user
, и оно будет иметь индекс, который обеспечивает быстрое соединение. Кроме того, он, таким образом, гарантирует ссылочную целостность: если работник не является NULL
, он ссылается на действительный username
объекта auth_user
.
Тогда мы можем выполнить запрос с помощью:
Design.objects<b>.select_related('worker')</b>
Вы можете использовать .only()
[Django -doc] для сужения извлекаемых столбцов, но если они не содержат большие объемы данных, их лучше включить.
Вы также можете извлечь значения из связанной модели с помощью .annotate(..)
:
from django.db.models import F
Design.objects<b>.annotate(</b>
first_name=F('worker__first_name'),
last_name=F('worker__last_name')
<b>)</b>
Здесь объекты Design
из этого набора запросов будут иметь два дополнительных атрибута: .first_name
и .last_name
.