【问题标题】:Deserializing SlugRelatedField on ForeignKey with Django Rest Framework使用 Django Rest 框架在 ForeignKey 上反序列化 SlugRelatedField
【发布时间】:2017-03-25 09:05:24
【问题描述】:

我正在努力使用 SlugRelatedField 设置 PrimaryKeyRelatedField。

我的 models.py 看起来像:

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)

我的看法是这样的:

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)

如果我将我的 serializers.py 设置为:

class FlightSerializer(serializers.ModelSerializer):
    class Meta:
        model = Flight
        fields = ('flight_number', 'origin', 'destination', 'scheduled_departure', 'scheduled_arrival')

从 shell 我看到序列化程序呈现为:

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)

我能够发布与数据库中的机场条目相匹配的起点和终点 pk 以创建新航班。太好了。

但是,我实际上需要发布机场代码,(即)LAX 作为出发地或目的地,并让 DRF 找出合适的实例。

我认为这样做的方法是使用 SlugRelatedField。尽管尽了最大努力,我还是无法正确设置。

我正在尝试像这样设置 serializers.py:

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')

当我传递像 KMS 这样的有效机场代码 (iata) 作为来源时,它似乎被忽略了。

这就是 SlugRelatedField 的用途吗?

我做错了什么让我的 POST 发送一个字符串,让 DRF 查看一个匹配 db 条目的字段并像我简单地传递一个有效的 PK 时一样漂亮地存储它?

【问题讨论】:

    标签: django rest serialization frameworks


    【解决方案1】:

    从同事那里得到了一些帮助。

    问题是我只是错误配置了 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')
    

    【讨论】:

      猜你喜欢
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      相关资源
      最近更新 更多