我正在尝试使用外键关系发布到我的API。它给我一个错误,说它期待一个字典而不是character_opponent
,stage
和import uuid
from django.db import models
from django.utils import timezone
from analysis.models import Analysis
from characters.models import Character
from stages.models import Stage
class Match(models.Model):
analysis = models.ForeignKey(Analysis, on_delete=models.CASCADE)
character = models.ForeignKey(Character, on_delete=models.CASCADE, related_name='character')
character_won = models.BooleanField()
character_opponent = models.ForeignKey(Character, on_delete=models.CASCADE, related_name='character_opponent')
character_opponent_won = models.BooleanField()
created_at = models.DateTimeField(editable=False)
id = models.UUIDField(primary_key=True, default=uuid.uuid4)
updated_at = models.DateTimeField(editable=False)
stage = models.ForeignKey(Stage, on_delete=models.CASCADE)
def __str__(self):
return '%s vs. %s on %s' % (self.character, self.character_opponent, self.stage)
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"
的int。这是因为我的模型设置方式。他们有外键关系。有问题的模型如下所示:
from rest_framework import serializers
from matches.models import Match
from characters.serializers import CharacterSerializer
from stages.serializers import StageSerializer
class MatchSerializer(serializers.ModelSerializer):
character = CharacterSerializer()
character_opponent = CharacterSerializer()
stage = StageSerializer()
class Meta:
model = Match
fields = ('id', 'analysis', 'character', 'character_won', 'character_opponent', 'character_opponent_won', 'stage')
这是我的序列化器:
{{1}}
我在这里找不到一些可以正确发布的选项吗?很明显,每次我想发布一些东西时,我都不应该传递整个角色对象,对吧?我应该能够传递主键。
答案 0 :(得分:1)
它将归结为您的CharacterSerializer和StageSerializer。如果您想输入1种格式(使用serialisers.PrimaryKeyRelatedField()
),但输出另一种格式(CharacterSerializer
,StageSerializer
),则最好使用2个序列化服务器并在您的视图中切换。
在您的视图中,您可以覆盖get_serializer_class
并检查您的请求方法,或者在视图集的情况下,您可以检查被调用的方法。
答案 1 :(得分:1)
从您的几条评论中我了解到您需要GET
方法中的嵌套序列化程序。我的建议是,为您的API类使用两个或更多个序列化程序
假设您正在使用ModelViewSet
API类正在使用,那么您可以覆盖get_serializer_class()
方法,如下所示,
from rest_framework.viewsets import ModelViewSet
class MatchAPI(ModelViewSet):
queryset = Match.objects.all()
def get_serializer_class(self):
if self.action == 'create':
return MatchCreateSerializer
return MatchSerializer
您的MatchCreateSerializer
将是这样的,
class MatchCreateSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = Match
因此,您只需在创建PKs
实例
analysis
character
,Match
等
答案 2 :(得分:0)
使用其他序列化程序声明与序列化程序相关的字段时,如此
character = CharacterSerializer()
你告诉django-rest-framework你想要一个嵌套的序列化器。你想要的是这样的东西
character = serializers.PrimaryKeyRelatedField()
或者您实际上可以将显式字段声明保留在序列化程序之外(因为这是默认值),请参阅the doc on serializer relations。