Как сделать PK модели как FK для всех моделей проекта Django
Мне нужна помощь, чтобы понять, как лучше всего разработать следующий пример использования модели в Django.
У меня есть модель "Client", которая определяет идентификатор клиента для приложения. Эта модель должна ссылаться как внешний ключ на все модели проекта.
Вот фрагмент кода:
Class Client(Model):
ClientId = models.AutoField(primary_key=True)
Class Location(Model):
LocationId = models.AutoField(primary_key=True)
ClientId = models.ForeignKey(Client, on_delete=models.CASCADE, db_column="ClientId")
Class User(Model):
UserId = models.AutoField(primary_key=True)
ClientId = models.ForeignKey(Client, on_delete=models.CASCADE, db_column="ClientId")
Class Document(Model):
DocumentId = models.AutoField(primary_key=True)
ClientId = models.ForeignKey(Client, on_delete=models.CASCADE, db_column="ClientId")
Как показано выше, Location, User и Document все имеют ClientId как FK. Однако это работает....
Проблема с вышеуказанным дизайном заключается в том, что я должен явно указать ClientId как FK в каждой таблице. Поскольку ClientID является необходимым FK для каждой модели проекта, я хочу знать, есть ли какой-нибудь простой шаблон проектирования, где ClientId определяется как FK для каждой модели без его указания.
Я думал использовать наследование, но это не работает, так как есть только один глобальный ClientId и определение Client как родителя для каждой модели означает, что он создает Client Id каждый раз, когда создается новый экземпляр ребенка.
Любая идея или указатель на этот вопрос.
You can work with an abstract base model. The only problem here might be that the related_name=…
[Django-doc] and related_query_name=…
[Django-doc] can clash, so you can specify this with:
from django.db import models
class Client(models.Model):
client_id = models.AutoField(primary_key=True)
class ClientRelatedModel(models.Model):
client = models.ForeignKey(
Client,
on_delete=models.CASCADE,
db_column='ClientId',
related_name='%(class)s_set',
related_query_name='%(class)s',
)
class Meta:
abstract = True
class Location(ClientRelatedModel):
location_id = models.AutoField(primary_key=True)
class Document(ClientRelatedModel):
document_id = models.AutoField(primary_key=True)
Примечание: обычно имена полей в модели Django записываются в snake_case, а не PascalCase, поэтому должно быть:
client_id
вместо.clientId
Примечание: Обычно не добавляют суффикс
.…_id
к полюForeignKey
, так как Django автоматически добавит поле-"близнец" с суффиксом…_id
. Поэтому он должен бытьclient
, вместо.clientId