Использование сигналов для двух моделей, наследующих от User в Django
Предположим, у нас есть две модели, которые имеют сигнал к модели User:
from django.db import models
from django.contrib.auth.models import User
from django.db.models import signals
class Company(User):
name = models.CharField(null=True, blank=True, max_length=30)
if created:
Company.objects.create(
user_ptr_id=instance.id,
username=instance.username,
password=instance.password,
email=instance.email,
first_name=instance.first_name,
last_name=instance.last_name,
is_active=instance.is_active,
is_superuser=instance.is_superuser,
is_staff=instance.is_staff,
date_joined=instance.date_joined,
)
signals.post_save.connect(
create_company, sender=User, weak=False, dispatch_uid="create_companies"
)
class Individual(User):
name = models.CharField(null=True, blank=True, max_length=30)
def create_job_seeker(sender, instance, created, **kwargs):
"""
:param instance: Current context User instance
:param created: Boolean value for User creation
:param kwargs: Any
:return: New Seeker instance
"""
if created:
'''
we should add a condition on whether the Company uses the same username
if true, then, we must not create a JobSeeker and we would disable the account using
Firebase Admin
'''
JobSeeker.objects.create(
user_ptr_id=instance.id,
username=instance.username,
password=instance.password,
email=instance.email,
first_name=instance.first_name,
last_name=instance.last_name,
is_active=instance.is_active,
is_superuser=instance.is_superuser,
is_staff=instance.is_staff,
date_joined=instance.date_joined,
)
signals.post_save.connect(
create_job_seeker, sender=User, weak=False, dispatch_uid="create_job_seekers"
)
Теперь, каждый раз, когда создается пользователь, мы должны иметь возможность расширять его через модели Individual и Company. Но я хочу запретить использование обоих объектов. Пользователь может редактировать либо объект Company, либо объект Individual, но не оба. Должен ли я переопределить метод сохранения следующим образом:
def save(self, *args, **kwargs):
if not Company.objects.filter(username=self.username).exists():
super(Model, self).save(*args, **kwargs)
else:
raise 'Some error'
Или я должен добавить условие на созданный метод, например, так:
...
if created and Company.objects.filter(username, self.username).exists() == False:
Company.objects.create(
...
Какой подход лучше? И есть ли другой подход, который вы могли бы предложить?
Сигналы, в большинстве случаев, я считаю лучшим способом обработки обмена данными между моделями при условии, что CRUD для каждой связанной модели не выполняется вместе. Поэтому post_save, pre_save, post_delete, pre_delete и т.д. обычно являются лучшим способом работы с данными, на которые опирается любой экземпляр модели. Это относится и к манипулированию данными модели после сохранения. Сигналы были разработаны специально для этого. Другая замечательная особенность сигналов заключается в том, что их можно подключать по всему проекту, а не только там, где определена модель. Просто импортируйте модель и сигнал, который вы хотите подключить к ней, и бам!
Как использовать сигналы? следуйте документации django здесь. это очень просто