Django休息框架发布预计字典

时间:2018-06-07 22:25:10

标签: python django django-rest-framework

我正在尝试使用外键关系发布到我的API。它给我一个错误,说它期待一个字典而不是character_opponentstageimport 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}}

我在这里找不到一些可以正确发布的选项吗?很明显,每次我想发布一些东西时,我都不应该传递整个角色对象,对吧?我应该能够传递主键。

3 个答案:

答案 0 :(得分:1)

它将归结为您的CharacterSerializer和StageSerializer。如果您想输入1种格式(使用serialisers.PrimaryKeyRelatedField()),但输出另一种格式(CharacterSerializerStageSerializer),则最好使用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 characterMatch

答案 2 :(得分:0)

使用其他序列化程序声明与序列化程序相关的字段时,如此

character = CharacterSerializer()

你告诉django-rest-framework你想要一个嵌套的序列化器。你想要的是这样的东西

character = serializers.PrimaryKeyRelatedField()

或者您实际上可以将显式字段声明保留在序列化程序之外(因为这是默认值),请参阅the doc on serializer relations