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 не до конца написаны!
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 2:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 1:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 1:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-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'у продукта.
Всё, даже никаких профилей не нужно. И получится гибкая система, в которой пользователь может быть как клиентом, так и владельцем продукта.
А так только усложняете себе жизнь, и тем кто теоретически бы стал поддерживать ваш проект после вас.
мдааа ... прочитал ваши комментарии ... спасибо ... я понял вашу идею