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 не до конца написаны!
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Добрый день.
Ну да, если есть возможность разруливать через 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'у продукта.
Всё, даже никаких профилей не нужно. И получится гибкая система, в которой пользователь может быть как клиентом, так и владельцем продукта.
А так только усложняете себе жизнь, и тем кто теоретически бы стал поддерживать ваш проект после вас.
мдааа ... прочитал ваши комментарии ... спасибо ... я понял вашу идею