May 15, 2020, 10:27 a.m.

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 не до конца написаны!

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
5

Добрый день.
Ну да, если есть возможность разруливать через 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'у продукта.

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting Timeweb
June 5, 2020, 11:20 p.m.
Aleksej

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
June 5, 2020, 11:15 p.m.
Aleksej

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
V
June 5, 2020, 4:47 p.m.
Vladzo

C++ - Test 005. Structures and Classes

  • Result:83points,
  • Rating points4
Last comments
June 5, 2020, 10:52 a.m.
progammist

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
June 5, 2020, 1:39 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
June 5, 2020, 1:34 a.m.
IscanderChe

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
June 5, 2020, 1:31 a.m.
Evgenij Legotskoj

Qt/C++ - Tutorial 091. How to write a custom delegate controlling the highlighting of a row in a table

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
Now discuss on the forum
s
June 6, 2020, 1:54 a.m.
shuric

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

Доброго дня. Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ? mainwindow.cpp MainWindow::MainWi…
s
June 6, 2020, 12:45 a.m.
shuric

Qt/C++ особенности QProxyStyle

Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком. Пришлось переписать - кому интересно: использовал stackedWidget для пе…
June 5, 2020, 11:08 p.m.
Aleksej

Посоветуйте новичку (базы данных и Qt, что учить)

Блин, а я недавно купил Шлее Qt 5.10 :( С детства хотел стать программистом, баловался Паскалем, писал простенькие программки на Delphi, создавал движок на php, изучал C (забросил и перешел на п…
June 5, 2020, 1:09 p.m.
IscanderChe

QPlainTextEdit настройка цвета фона

Вечер добрый. Пытаюсь настроить цвет фона QPlainTextEdit следующим образом: CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent){ ... QPalette::ColorRole role = bac…
June 5, 2020, 6:13 a.m.
IscanderChe

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB