SlugRelatedFieldを使用してPrimaryKeyRelatedFieldを設定しようとしています。Django RestフレームワークでForeignKeyのSlugRelatedFieldを非直列化する
マイmodels.pyは、次のようになります。シェルIから
class FlightSerializer(serializers.ModelSerializer):
class Meta:
model = Flight
fields = ('flight_number', 'origin', 'destination', 'scheduled_departure', 'scheduled_arrival')
:私は私のserializers.pyを設定した場合
class FlightList(APIView):
# List all flights, or create a new flight
queryset = Flight.objects.all()
serializer_class = FlightSerializer
def get(self, request, format=None):
flights = Flight.objects.all()
serializer = FlightSerializer(flights, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = FlightSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
print serializer.validated_data
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
:私のビューがどのように見える
class Airport(models.Model):
name = models.CharField(max_length=200, blank=True)
iata = models.CharField(max_length=20, blank=True)
<other unrelated fields>
class Flight(models.Model):
flight_number = models.CharField(max_length=25, blank=False, unique=True)
origin = models.ForeignKey(Airport, related_name='origin', null=True)
destination = models.ForeignKey(Airport, related_name='destination', null=True)
scheduled_departure = models.DateTimeField(null=True)
scheduled_arrival = models.DateTimeField(null=True)
シリアライザのレンダリングを参照してください:
FlightSerializer():
flight_number = CharField(max_length=25, validators=[<UniqueValidator(queryset=Flight.objects.all())>])
origin = PrimaryKeyRelatedField(allow_null=True, queryset=Airport.objects.all(), required=False)
destination = PrimaryKeyRelatedField(allow_null=True, queryset=Airport.objects.all(), required=False)
scheduled_departure = DateTimeField(allow_null=True, required=False)
scheduled_arrival = DateTimeField(allow_null=True, required=False)
新しい飛行を作成するために、データベース内の空港エントリと一致するPOST起点と目的地pkを取得することができます。すばらしいです。
実際には空港コード(LAX)を出発地または目的地として投稿し、DRFに適切なインスタンスを把握させる必要があります。
私はこれを行う方法がSlugRelatedFieldを使用していると思います。最善の努力にもかかわらず、私はこれを適切に設定することができません。
私はこのようなserializers.pyを設定しようとしています:
私はそれを無視し得るように思わ原点としてKMSのような有効な空港コード(IATA)を渡すclass FlightSerializer(serializers.ModelSerializer):
origin = serializers.SlugRelatedField(
many=True,
read_only=True,
slug_field='iata',
)
class Meta:
model = Flight
fields = ('flight_number', 'origin', 'destination', 'scheduled_departure', 'scheduled_arrival')
。
これはSlugRelatedFieldが使用されているものですか?
私のPOSTが文字列を送信するのを許すには間違っているのですが、DRFはdbエントリを照合するフィールドを見て、単に有効なPKを渡すと美しく表示しますか?