我正在使用Django 3.2和Django Rest Framework 3.14。
我的用户应该能够关注其他用户,比如在社交网站上。当序列化一个完整的User时,我希望获得以下用户的列表,以及其他数据,如followdatetime。然而,我希望反应保持“平稳”,如下所示:
{ "username":"admin", "followers":[ { "username":"testuser", --additional user fields-- "follow_date":"2023-02-08 01:00:02" }, --additional followers-- ], --additional user fields-- }
我似乎只能使用一个额外的序列化程序来“完成”我的联接模型,结果是:
{ "username":"admin", "followers":[ { "user":{ "username":"testuser", --additional user fields-- }, "follow_date":"2023-02-08 01:00:02" }, --additional followers-- ], --additional user fields-- }
注意如何有一个额外的user
键
"user":{ "username":"testuser", --additional user fields-- },
我不想那样!
我的模型看起来像这样:
class Follower(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.RESTRICT, related_name="followers") follower = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.RESTRICT, related_name="following") follow_date = models.DateTimeField(auto_now_add=True)
我的序列化程序如下所示(为简洁起见,删除了额外字段):
class UserSnippetSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['username'] class FollowerSerializer(serializers.ModelSerializer): user = UserSnippetSerializer(source='follower') class Meta: model = Follower fields = ['user', 'follow_date'] class FullUserSerializer(serializers.ModelSerializer): followers = FollowerSerializer(source='user.followers', many=True) following = FollowerSerializer(source='user.following', many=True) class Meta: model = Profile fields = ['username', 'followers', 'following']
考虑到这一点,我明白它为什么会这样做。但我似乎找不到任何方法来跳过额外的user
键,同时仍然包含bot用户信息和follow_date
。
我尝试过在User上玩代理模型,但这似乎没有帮助。我怀疑这不是配置问题,尽管我希望这样做,而且我需要重写一些内部函数。但我似乎找不到那会是什么。
实现这一目标的最佳方式是什么?