User custome model code - ваше мнение
всем привет
я пытаюсь задачку решить.
я переопределил модель пользователя от AbstractUser и назвал ее SiteUser
в классе SiteUser я определил 2 BooleanField с default=False => is_owner и is_client
дальше я создал 2 модели (ProfileClient и ProfileOwner) что то профиля со связью OneToOneField на SiteUser
дальше я хочу чтобы на момент регистрации пользователя (пока что я это делаю из под суперпользователя из админки), создавался автоматически соответствующий профили либо ProfileClient либо ProfileOwner в зависимости от того какой флажёк он поставил is_owner или is_client
реализовал я это с помощью "def user_created"
вот мой код:
- class SiteUser(AbstractUser):
- is_owner = models.BooleanField(_('AE?'), default=False)
- is_client = models.BooleanField(_('Client?'), default=False)
- email_verified = models.BooleanField(_("Email verificat?"), default=False)
- phone_verified = models.BooleanField(_("Telefon verificat?"), default=False)
- class ProfileClient(models.Model):
- profileclient_username = models.OneToOneField(SiteUser, on_delete=models.CASCADE, primary_key=True, related_name="client_profile")
- profileclient_avatar = models.ImageField("Photo", upload_to="client/", null=True, blank=True,
- default='no_image_app_content.png')
- def __str__(self):
- return str(self.profileclient_username)
- # return str(self.profileclient_username)
- class Meta:
- verbose_name = "Profil client"
- verbose_name_plural = "Profil clienti"
- class ProfileOwner(models.Model):
- profileowner_username = models.OneToOneField(SiteUser, on_delete=models.CASCADE, primary_key=True, related_name="owner_profile")
- profileowner_avatar = models.ImageField("Photo", upload_to="owner/", null=True, blank=True,
- default='no_image_app_content.png')
- def __str__(self):
- return str(self.profileowner_username)
- class Meta:
- verbose_name = "Profil owner"
- verbose_name_plural = "Profil owner"
- @receiver(post_save, sender=SiteUser)
- def user_created(sender, instance, created, **kwargs):
- print(f'** in user_created **')
- if created and instance.is_owner:
- print(f'** owner **')
- ProfileOwner.objects.create(profileowner_username=instance)
- elif created and instance.is_client:
- print(f'** client **')
- ProfileClient.objects.create(profileclient_username=instance)
прошу комментарии, возражения, поправки
кстати, модели ProfileClient и ProfileOwner не до конца написаны!
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
- Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Добрый день.
Ну да, если есть возможность разруливать через receiver декораторы, то так и нужно делать, чтобы код в других местах не засорять.
Хотя то, что вы сделали две отдельных модели, в которых по сути одна и таже информация, является бесполезным.
Чем по вашему будет отличаться profileclient_username от profileowner_username или profileclient_avatar от profileowner_avatar .
Тем более, что в AbstractUser уже есть username.
Это всё бесполезное дублирование инофрмации. На данный момент весь этот код можно удалять из проекта.
А поле аватар добавить в SiteUser.
смотрите, я создал 2 модели для профайлов исходя из идеи что для каждой модели будет своя таблица в БД
я планирую расширить функционал, хочу написать возможность чтобы ProfileClient и ProfileOwner обменивались сообшениями (типа приватного чата) и тут в моей задумке следуещая логика:
создавать сообщения могут только ProfileClient и созданные сообщения попадают пользователям ProfileOwner но не конкретному, а всем ProfileOwner которые соответствуют определенному условию (на пример только тем ProfileOwner которые входят в какую то категорию ). а уже в свою очередь те ProfileOwner которые получают сообщения могут ответить тому ProfileClient-у который создал данное сообщение
и для этих целей я так думаю чтобы снизить нагрузку на конкретную таблицу из БД я создал 2 таблицы
Это всё равно не меняет того факта, что обращаться к таблице SiteUser вам придётся, а дублирование информации только усложнит логику.
Когда три username и два avatar, которые отвечают за одно и тоже, так потом чёрт ногу сломит в таком проекте.
Нагрузку на базу данных это вряд ли снизит. Да и в чате, если будете сообщения забирать в виде списка, всё равно к трём таблицам обращаться будете. (ProfileOwner, ProfileClient, и SiteUser). Тем более, что Owner у вас не может быть одновременно и Client?
Смотрите, если есть какой-то Product, то у него может быть поле owner с внешним ключом на пользователя.
У продукта есть клиенты, ну и добавляйте ManyToMany поле для клиентов.
Чтобы разрешить отправлять клиетам сообщения пользователю продукта, достаточно будет проверить, что пользователь является клиентом продукта и пытается отправить сообщение именно owner'у продукта.
Всё, даже никаких профилей не нужно. И получится гибкая система, в которой пользователь может быть как клиентом, так и владельцем продукта.
А так только усложняете себе жизнь, и тем кто теоретически бы стал поддерживать ваш проект после вас.
мдааа ... прочитал ваши комментарии ... спасибо ... я понял вашу идею