Nano Hash - криптовалюты, майнинг, программирование

ManyToMany и промежуточная модель для отношений «последователи-последователи» для Django Rest Framework

Я работаю над приложением для блога с Django Rest Framework (очень оригинально, я знаю), и я пытаюсь добавить последователей/отслеживание отношений между пользователями. В настоящее время мой UserProfile реализован следующим образом:

from django.db import models
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver

User = get_user_model()

class UserProfile(models.Model):
    """Model For Extending Default Django User Model"""
    user = models.OneToOneField(User, 
                                on_delete=models.CASCADE, 
                                related_name='profile')
    username = models.CharField(max_length=150, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    avatar = models.ImageField(blank=True, null=True)

    def __str__(self):
        return f'{self.user.first_name} {self.user.last_name}'

    @property
    def full_name(self):
        return f'{self.user.first_name} {self.user.last_name}'

    @property
    def posts_list(self):
        return self.user.posts.filter(author=self.user)

    @property
    def comments_list(self):
        return self.user.comments.filter(author=self.user)

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, *args, **kwargs):
    """Automatically Create A User Profile When A New User IS Registered"""

    if created:
        user_profile = UserProfile(user=instance)
        setattr(user_profile, 'username', instance.username)
        user_profile.save()

Моя цель — создать способ связать пользовательские профили через отношения «Подписчик/Подписчик». Моей первой идеей было создать отношение ManyToMany, подобное следующему:

followers = models.ManyToManyField('self', symmetrical=False, blank=True)

Это имеет смысл для меня, так как UserProfile может иметь несколько подписчиков и следить за несколькими людьми. Если я хочу сериализовать эту модель, я могу использовать что-то вроде следующего:

class UserProfileDetailsSerializer(serializers.ModelSerializer):
    posts_list = SerializerMethodField(source="get_posts_list")
    followers = SerializerMethodField(source="get_followers")
    class Meta:
        model = UserProfile
        fields = ['username', 'avatar', 'bio', 'posts_list']

    def get_posts_list(self, obj):
        return PostDetailsSerializer(obj.user.posts.filter(author=obj.user.id, is_published=True), many=True, read_only=True).data

    def get_followers(self, obj):
        return FollowersSerializer(obj.user.profile.followers, many=True, read_only=True).data

Однако в этом сообщении о переполнении стека пользователи предложили наличие промежуточной модели вместо использования поля ManyToMany. Другие онлайн-ресурсы кажутся довольно разделенными между двумя подходами. Кто-нибудь может объяснить, когда можно использовать поля ManyToMany вместо промежуточных моделей и наоборот?


  • Оба подхода одинаковы, для отношения ManyToMany требуется промежуточная таблица для сохранения user_id и following_user_id 07.08.2021
  • Вы получите то же самое, что и в другом посте, только с followers = models.ManyToManyField("self", related_name="following") 07.08.2021
  • Вам понадобится промежуточная модель, если вы хотите получить дополнительную информацию об отношениях, например, если вы хотите узнать, когда отношения начались, добавив поле created_on в промежуточную модель. 07.08.2021
  • Понял, в этом есть смысл. 07.08.2021

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..