NomadMay 15, 2020, 11: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
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
TG

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

  • Result:53points,
  • Rating points-4
TG

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

  • Result:60points,
  • Rating points-1
TN

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

  • Result:40points,
  • Rating points-8
Last comments

Django - Tutorial 001. Deploying a site on Django + PostgreSQL + Gunicorn + Nginx

Ошибка в конфиге инжинкса про статику в root последний слеш лишний путь в таком виде получается /home/user/myprojectenv/myproject/myproject//static
  • Jurij
  • Jan. 20, 2021, 1:34 p.m.

Qt/C++ - Lesson 061. Adding images to the application using the Drag And Drop method from the file manager

// Вместо отрисовки иконки и текста будем отрисовывать только одно изображение // с небольшими отступами в 5 пикселей QPixmap pix(m_model->data(index).toString()); …
m
  • magrif
  • Jan. 19, 2021, 12:37 p.m.

Qt Сертификация

Здравствуйте. Подскажите, оплачивать ваучер прямо в выбранном тестовом центре? Можно ли загранник предъявить? Или свой паспорт, а заполнить транслитом? А то там пишут: Your name must exactl…
r
  • retmas
  • Jan. 17, 2021, 4:09 a.m.

Qt/C++ - Tutorial 074. Generating pseudo-random numbers, using STD library random

Дмитрий, решает. Просто автор, видимо, не сильно озаботился изучением документации QRandomGenerator. Да и в листинге с использованием qrand вызов функции qsrand на каждой итерации цикла нав…
g

Поздравляю всё Сообщество EVILEG с Новым Годом!!!

#include <iostream>using namespace std;int main() { cout << "Happy New Year and Thank you!"; return 0;}
Now discuss on the forum
DK

QScrollArea dynamically add QCheckBoxes

QWidget *materialContainer = new QWidget(this);QVBoxLayout *materialLay = new QVBoxLayout();materialContainer->setLayout(materialLay);ui->_materialScrollArea->setWidget(materialContaine…

Ошибка при работе утилиты не удалось получить фабрику класса com для компонента с clsid

Всем привет! Мне для тестов нужна одна утилита. Она тестирует определенное оборудование. Поставил ее на новый ноут с Windows 10 Домашняя, 64-бит, версия 10.0.19041. Утилита работает, но спу…

Как в Android открыть свернутое приложение?

Это не вам, тот коммент судя по всему удалили, или я написал не туда

Qt: INTERNAL ERROR: failed to install GetMessage hook: 1158

ESP8266 и вправду не корректно закрывало соединение. Причина оказалась банальной: перед функцией ухода в глубокий сон ESP.deepSleep(60e6) необходимо было поставить небольшую задержку delay(1). В…
  • Nomad
  • Jan. 20, 2021, 8:48 a.m.

Ограничение доступа к ресурсу с по django-cors-headers

всем привет помогите разобраться гуглю и ниче не помогает есть проект с drf установил django-cors-headers добавил в INSTALLED_APPS добавил MIDDLEWARE слой для cor…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB