首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django rest框架向序列化程序添加数据

Django rest框架向序列化程序添加数据
EN

Stack Overflow用户
提问于 2018-06-08 04:36:14
回答 1查看 1.9K关注 0票数 1

我正在尝试将数据添加到我的序列化程序。我有一个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以使其正确工作并发送相关数据。我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 04:53:38

您需要将match字段添加到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的已验证数据的列表。因此,您可以继续并在GameSerializer保存中直接创建Match对象。

参考:http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers

或者,如果您的用例涉及发送已存在的Match对象,而您只需要发送数据中的ids,则使用以下命令:

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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50749798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档