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()