NSProject
NSProject8 декабря 2022 г. 11:08

Подписчики и друзья в приложении Django. Путь непознаного...

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

class Frends(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    frend_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_frend")

    def __str__(self):
        return '%s' %s(user.username)

Тут вроде как всё замечательно выходит, но есть но. При каждом добавлении пользователя в друзья будет создаваться запись в бд а точнее две записи. И если при добавлении нескольких пользователей это нормально. То если их будет очень много то это не очень уже и удобно.

Второй вариант предполагает использование полей типа ManyToManyField. Что то типа вот этого:

class Frend(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    frend_user = models.ManyToManyField('self', blank=True, related_name='user_frend')

    def __str__(self):
        return '%s' %s(self.user.username)

Конечно можно сделать поле user не ForeignKey а OneToOneField но речь как то не об этом.
Сегодня половина ночи ушла на подбор правильного для меня варианта действий. В принципе в первом варианте легче сделать всякие там подтверждения и остальное на основе флагов. Во втором немного извратившись это тоже можно реализовать. В общем мозг кипит от выбора структуры самой модели что просто отказывается соображать напрочь. Естественно что спустя время ответ сам прийдёт мне в голову. Но на данный момент нужно реализовать именно эту модель и соответственно двигаться далее согласно своему тз.
По этому прошу вашей помощи и объяснений как же более правильно и лучше это реализовать. Буду очень благодарен за оказанную помощь.

P.S.

По итогу решилось что добавлять множество моделей расширяющей модель пользователя не совсем лучший случай. И всё таки как я не хотел переопределять модель пользователя мне это прийдётся всё таки сдклать. Ибо я подумал что не хорошо будет иметь множество моделей ведущих к пользователю, таких как "профиль, контакты, списки заблокированных и так далее". Пытаясь реализовать всё по разным моделям я не учёл тот факт что это не совсем удобно при проверках доступа и определённых действиях. К тому же оно порождает несколько лишних запросов в базу, чего мне бы не хотелось.
Бошльшая часть всех проверок будет нужна постоянной по этому не виже смысла выбирать дополнительно таблицы и заморачиваться с select_related and prefetch_related. По этому я просто добавлю дополнительные поля в переопределённую таблицу и оставлю первый способ реализации добавления подписчиков и друзей.
Хотя кому я всё это пишу то. По ходу себе)))

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

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

2
Evgenii Legotckoi
  • 9 декабря 2022 г. 4:17
  • Ответ был помечен как решение.

Начинание хорошее, но лучше не ломайте себе голову в пустую, а используйте эту батарейку для Джанго: django-friendship . Там есть весь необходимый функционал для реализации друзей и подписчиков.

    NSProject
    • 9 декабря 2022 г. 8:25

    Перед тем как лечь спать я тоже думал что нужно найти батарейку. Однако нагородил огород кода и изобрёл 5 колёсный велосипед. Пошёл записал, проверил. Вроде всё работает но вот велосипед ездит на одном колесе, 4 лишние.
    Спасибо я посмотрю в сторону данного дополнения.

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь
      d
      • dsfs
      • 26 апреля 2024 г. 10:56

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

      • Результат:80баллов,
      • Очки рейтинга4
      d
      • dsfs
      • 26 апреля 2024 г. 10:45

      C++ - Тест 002. Константы

      • Результат:50баллов,
      • Очки рейтинга-4
      d
      • dsfs
      • 26 апреля 2024 г. 10:35

      C++ - Тест 001. Первая программа и типы данных

      • Результат:73баллов,
      • Очки рейтинга1
      Последние комментарии
      k
      kmssr9 февраля 2024 г. 1:43
      Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
      АК
      Анатолий Кононенко5 февраля 2024 г. 8:50
      Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
      EVA
      EVA25 декабря 2023 г. 17:30
      Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
      J
      JonnyJo25 декабря 2023 г. 15:38
      Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
      G
      Gvozdik19 декабря 2023 г. 4:01
      Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
      Сейчас обсуждают на форуме
      G
      Gar22 апреля 2024 г. 11:46
      Clipboard Как скопировать окно целиком в clipb?
      DA
      Dr Gangil Academics20 апреля 2024 г. 13:45
      Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
      a
      a_vlasov14 апреля 2024 г. 12:41
      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
      Павел Дорофеев
      Павел Дорофеев14 апреля 2024 г. 8:35
      QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
      f
      fastrex4 апреля 2024 г. 10:47
      Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

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