Nomad
15 мая 2020 г. 21:27

User custome model code - ваше мнение

django, custommodel

всем привет

я пытаюсь задачку решить.
я переопределил модель пользователя от 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"
вот мой код:

  1. class SiteUser(AbstractUser):
  2. is_owner = models.BooleanField(_('AE?'), default=False)
  3. is_client = models.BooleanField(_('Client?'), default=False)
  4. email_verified = models.BooleanField(_("Email verificat?"), default=False)
  5. phone_verified = models.BooleanField(_("Telefon verificat?"), default=False)
  6.  
  7.  
  8. class ProfileClient(models.Model):
  9. profileclient_username = models.OneToOneField(SiteUser, on_delete=models.CASCADE, primary_key=True, related_name="client_profile")
  10. profileclient_avatar = models.ImageField("Photo", upload_to="client/", null=True, blank=True,
  11. default='no_image_app_content.png')
  12.  
  13. def __str__(self):
  14. return str(self.profileclient_username)
  15. # return str(self.profileclient_username)
  16.  
  17. class Meta:
  18. verbose_name = "Profil client"
  19. verbose_name_plural = "Profil clienti"
  20.  
  21.  
  22. class ProfileOwner(models.Model):
  23. profileowner_username = models.OneToOneField(SiteUser, on_delete=models.CASCADE, primary_key=True, related_name="owner_profile")
  24. profileowner_avatar = models.ImageField("Photo", upload_to="owner/", null=True, blank=True,
  25. default='no_image_app_content.png')
  26.  
  27. def __str__(self):
  28. return str(self.profileowner_username)
  29.  
  30. class Meta:
  31. verbose_name = "Profil owner"
  32. verbose_name_plural = "Profil owner"
  33.  
  34.  
  35. @receiver(post_save, sender=SiteUser)
  36. def user_created(sender, instance, created, **kwargs):
  37. print(f'** in user_created **')
  38. if created and instance.is_owner:
  39. print(f'** owner **')
  40. ProfileOwner.objects.create(profileowner_username=instance)
  41. elif created and instance.is_client:
  42. print(f'** client **')
  43. ProfileClient.objects.create(profileclient_username=instance)

прошу комментарии, возражения, поправки

кстати, модели ProfileClient и ProfileOwner не до конца написаны!

2

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 18 мая 2020 г. 12:59

Добрый день.
Ну да, если есть возможность разруливать через receiver декораторы, то так и нужно делать, чтобы код в других местах не засорять.

Хотя то, что вы сделали две отдельных модели, в которых по сути одна и таже информация, является бесполезным.

Чем по вашему будет отличаться profileclient_username от profileowner_username или profileclient_avatar от profileowner_avatar .
Тем более, что в AbstractUser уже есть username.

Это всё бесполезное дублирование инофрмации. На данный момент весь этот код можно удалять из проекта.
А поле аватар добавить в SiteUser.

    Nomad
    • 18 мая 2020 г. 15:49
    • (ред.)

    смотрите, я создал 2 модели для профайлов исходя из идеи что для каждой модели будет своя таблица в БД
    я планирую расширить функционал, хочу написать возможность чтобы ProfileClient и ProfileOwner обменивались сообшениями (типа приватного чата) и тут в моей задумке следуещая логика:

    создавать сообщения могут только ProfileClient и созданные сообщения попадают пользователям ProfileOwner но не конкретному, а всем ProfileOwner которые соответствуют определенному условию (на пример только тем ProfileOwner которые входят в какую то категорию ). а уже в свою очередь те ProfileOwner которые получают сообщения могут ответить тому ProfileClient-у который создал данное сообщение

    и для этих целей я так думаю чтобы снизить нагрузку на конкретную таблицу из БД я создал 2 таблицы

      Evgenii Legotckoi
      • 18 мая 2020 г. 15:56

      Это всё равно не меняет того факта, что обращаться к таблице SiteUser вам придётся, а дублирование информации только усложнит логику.
      Когда три username и два avatar, которые отвечают за одно и тоже, так потом чёрт ногу сломит в таком проекте.

      Нагрузку на базу данных это вряд ли снизит. Да и в чате, если будете сообщения забирать в виде списка, всё равно к трём таблицам обращаться будете. (ProfileOwner, ProfileClient, и SiteUser). Тем более, что Owner у вас не может быть одновременно и Client?

        Evgenii Legotckoi
        • 18 мая 2020 г. 16:09
        • Ответ был помечен как решение.

        Смотрите, если есть какой-то Product, то у него может быть поле owner с внешним ключом на пользователя.
        У продукта есть клиенты, ну и добавляйте ManyToMany поле для клиентов.

        Чтобы разрешить отправлять клиетам сообщения пользователю продукта, достаточно будет проверить, что пользователь является клиентом продукта и пытается отправить сообщение именно owner'у продукта.

        Всё, даже никаких профилей не нужно. И получится гибкая система, в которой пользователь может быть как клиентом, так и владельцем продукта.
        А так только усложняете себе жизнь, и тем кто теоретически бы стал поддерживать ваш проект после вас.

          Nomad
          • 18 мая 2020 г. 18:15

          мдааа ... прочитал ваши комментарии ... спасибо ... я понял вашу идею

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            • Последние комментарии
            • IscanderChe
              12 апреля 2025 г. 17:12
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              1 апреля 2025 г. 11:41
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              9 марта 2025 г. 21:02
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              9 марта 2025 г. 16:14
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              22 ноября 2024 г. 21:51
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…