我正在尝试将数据添加到我的序列化程序。我有一个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
以使其正确工作并发送相关数据。我该怎么做呢?
发布于 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()
https://stackoverflow.com/questions/50749798
复制相似问题