Python - Django: выбор нескольких полей из разных моделей для сериализации в один результат json

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

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, к сериализуемым результатам, но я не смог найти примеры добавления конкретных полей из связанной модели к сериализуемым результатам. В основном, я пытаюсь выяснить эквивалент модели django для следующего SQL оператора

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

Наконец, когда я получу результаты такого запроса, как я буду сериализовать объединенные объекты? Нужно ли мне создать другую модель, представляющую собой комбинацию двух моделей?

Я нашел то, что искал, я могу использовать вложенный сериализатор, вот ответ stack overflow, который направил меня в правильном направлении: Сериализовать данные из нескольких моделей django

Вот документация по фреймворку отдыха 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()
Вернуться на верх