Модель 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()

Моя цель - создать способ связать UserProfiles через отношения Follower/Following. Моя первая идея заключалась в создании отношения 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

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

Вернуться на верх