2016-11-11 4 views
0

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を渡すと美しく表示しますか?

答えて

0

これに関する同僚の助けがありました。

問題は、SlugRelatedFieldの設定が間違っていたことです。空港コードを取得するには、クエリーセットを使用してslug_fieldを設定する必要がありました。それだけです:

class FlightSerializer(serializers.ModelSerializer): 

origin = serializers.SlugRelatedField(
    slug_field='iata', 
    queryset=Airport.objects.all() 
) 
class Meta: 
    model = Flight 
    fields = ('flight_number', 'origin', 'destination', 'scheduled_departure', 'scheduled_arrival') 
関連する問題