Использование сигналов для двух моделей, наследующих от 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 здесь. это очень просто

https://docs.djangoproject.com/en/4.0/topics/signals/

Вернуться на верх