Nomad
Nomad15 мая 2020 г. 11: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"
вот мой код:

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
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            AD

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:50баллов,
            • Очки рейтинга-4
            m
            • molni99
            • 26 октября 2024 г. 8:37

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80баллов,
            • Очки рейтинга4
            m
            • molni99
            • 26 октября 2024 г. 8:29

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:20баллов,
            • Очки рейтинга-10
            Последние комментарии
            ИМ
            Игорь Максимов22 ноября 2024 г. 19:51
            Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii Legotckoi31 октября 2024 г. 21:37
            Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZE19 октября 2024 г. 15:19
            Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов5 октября 2024 г. 14:51
            Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas55 июля 2024 г. 18:02
            QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Сейчас обсуждают на форуме
            Evgenii Legotckoi
            Evgenii Legotckoi24 июня 2024 г. 22:11
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            t
            tonypeachey115 ноября 2024 г. 14:04
            google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
            NSProject
            NSProject4 июня 2022 г. 10:49
            Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
            9
            9Anonim25 октября 2024 г. 16:10
            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

            Следите за нами в социальных сетях