NSProject
8 декабря 2022 г. 22:08

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

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

  1. class Frends(models.Model):
  2. user = models.ForeignKey(User, on_delete=models.CASCADE)
  3. frend_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_frend")
  4.  
  5. def __str__(self):
  6. return '%s' %s(user.username)

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

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

  1. class Frend(models.Model):
  2. user = models.ForeignKey(User, on_delete=models.CASCADE)
  3. frend_user = models.ManyToManyField('self', blank=True, related_name='user_frend')
  4.  
  5. def __str__(self):
  6. return '%s' %s(self.user.username)

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

P.S.

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

2

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

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

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

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

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

      Комментарии

      Только авторизованные пользователи могут публиковать комментарии.
      Пожалуйста, авторизуйтесь или зарегистрируйтесь
      • Последние комментарии
      • Evgenii Legotckoi
        16 апреля 2025 г. 17:08
        Благодарю за отзыв. И вам желаю всяческих успехов!
      • 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, установлены. Кроме одного... Когда пытаюсь скомпилиров…