Django rest framework добавляет данные в сериализатор - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь добавить данные в мой сериализатор.У меня есть модель Game, а Game может иметь несколько моделей Match.Дело в том, что модель Game не знает об этих отношениях.Связь с моделью Match является внешним ключом к Game.

Однако бывают случаи, когда я получаю Game, и я хочу включить в них модели Match.Вот моя модель для Game:

import uuid
from django.db import models
from django.utils import timezone

class Game(models.Model):
    created_at = models.DateTimeField(editable=False)
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    updated_at = models.DateTimeField(editable=False)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''
        if not self.created_at:
            self.created_at = timezone.now()
        self.updated_at = timezone.now()
        return super(Analysis, self).save(*args, **kwargs)

    class Meta:
        db_table = "games"

И моя Match модель:

import uuid
from django.db import models
from django.utils import timezone
from games.models import Game

class Match(models.Model):
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
    created_at = models.DateTimeField(editable=False)
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    updated_at = models.DateTimeField(editable=False)

    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''
        if not self.created_at:
            self.created_at = timezone.now()
        self.updated_at = timezone.now()
        return super(Match, self).save(*args, **kwargs)

    class Meta:
        db_table = "matches"

И моя GameSerializer:

from rest_framework import serializers
from games.models import Game
from games.serializers import GameSerializer

class GameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Game
        fields = ('id', 'created_at', 'updated_at')

Я предполагаю, что мне нужно настроить GameSerializer для правильной работы и отправить соответствующие данные.Как мне это сделать?

1 Ответ

0 голосов
/ 07 июня 2018

Вам необходимо добавить поле совпадений в GameSerializer и самостоятельно обработать сохранение.

class GameSerializer(serializers.ModelSerializer):
    matches = MatchSerializer(many=True, source='match_set')

    def save(self):
        matches = self.validated_data.get('matches', [])
        game = super(GameSerializer, self).save()
        for match in matches:
            match['game'] = game
            Match.objects.create(**match)

Добавить совпадения на свои поля.В validated_data сериализатора, matches будет список проверенных данных из MatchSerializer.Таким образом, вы можете пойти дальше и создать объект Match прямо в сохранении GameSerializer.

Ссылка: http://www.django -rest-framework.org / api-guide / Relations / # Writable-nested-serializers

Или, если ваш сценарий использования включает отправку матчейсуществующий объект соответствия, и вам нужно будет только отправить идентификаторы в ваших данных, а затем использовать это:

class GameSerializer(serializers.ModelSerializer):
    matches = serializers.ListField(
        child=serializers.PrimaryKeyRelatedField(Match))

    def save(self):
        matches = self.validated_data.get('matches')
        game = super(GameSerializer, self).save()
        for match in matches:
            match.game = game
            match.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...