Модель 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 вместо промежуточных моделей и наоборот?