Python - Django:select 来自不同模型的多个字段序列化为一个 json 结果

Python - Django: select mulitple fields from different models to serialize into one json result

我目前正在我的第一个 Django 项目中工作,并且正在使用 Django 中包含的身份验证机制。我目前有一个与 auth_user table 中的用户具有外键关系的游戏模型。以下是以下字段:

class Game(models.Model):
    game_id = models.UUIDField(default=uuid.uuid4, editable=False, max_length=10)
    host = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete = models.CASCADE)
    join_code = models.CharField(max_length=100, null=True)
    active = models.BooleanField(default=True)

我目前有一个视图方法,它只抓取所有活动的游戏对象,然后将这些结果传递给序列化程序,序列化程序将数据返回给客户端。

def get(self, request, format=None):
    games = Game.objects.filter(active__exact=True)
    serializer = GameSerializer(games, many=True)
    return Response(serializer.data)

我想将 AUTH_USER_MODEL 中的用户名和电子邮件字段添加到要序列化的结果中,但我一直无法找到将相关模型中的特定字段添加到结果中的示例被序列化。基本上,我试图找出等同于以下 SQL 语句

的 django 模型
select u.username, u.email, g.* from game g
inner join AUTH_USER_MODEL u on u.user_id = g.host_id

最后,一旦我得到了那种查询的结果,我将如何序列化组合的对象?我是否需要创建另一个结合这两个模型的模型?

我找到了我要找的东西,我可以使用嵌套的序列化器,这里是堆栈溢出的答案,为我指明了正确的方向:

这是 Django 休息框架文档:https://www.django-rest-framework.org/api-guide/relations/#nested-relationships

你的序列化器应该是这样的 -

class AuthUserModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthUserModel
        fields = ('username', 'email')

class GameSerializer(serializers.ModelSerializer):
    auth = AuthUserModelSerializer()

    class Meta:
        model = Game
        fields = '__all__'

在你想要的地方使用你的序列化器 -

serializer = GameSerializer()

现在在您的序列化器响应中,您将从 game 模型和 username,emailauth_user_model 获得所有字段。