0

我在DRF工作,并有串行,看起来像这样:Django的 - SlugRelated返回完整的对象

class PendingRequestSerializer(serializers.ModelSerializer): 

    driver = serializers.SlugRelatedField(
     slug_field='username', 
     queryset=User.objects.all() 
    ) 

    passenger = serializers.SlugRelatedField(
     slug_field='username', 
     queryset=User.objects.all() 
    ) 

    class Meta: 
     model = PendingRequest 
     fields = ('passenger', 'driver', 'ride',) 
     read_only_fields = ('passenger',) 

型号:

class PendingRequest(models.Model): 
    driver = models.ForeignKey('auth.User', related_name='driver_pending_requests') 
    passenger = models.ForeignKey('auth.User', related_name='passenger_pending_requests') 
    ride = models.ForeignKey(Ride) 

我可以成功返回用户名驱动程序乘客SlugRelatedField

现在 - 为领域,我希望得到整个换乘对象,不仅是一个字段(如在乘客和驾驶员)。

该怎么办?

回答

0

您可以使用嵌套序列化。

DRF提供了一个名为nested serializers的功能。

为了您例如,你可以做到以下几点:

class PendingRequestSerializer(serializers.ModelSerializer): 

    driver = serializers.SlugRelatedField(
     slug_field='username', 
     queryset=User.objects.all() 
    ) 

    passenger = serializers.SlugRelatedField(
     slug_field='username', 
     queryset=User.objects.all() 
    ) 

    ride = RideSerializer() 

    class Meta: 
     model = PendingRequest 
     fields = ('passenger', 'driver', 'ride',) 
     read_only_fields = ('passenger',) 

这将产生正常的JSON和,而不是显示在乘坐领域,它会窝在整个乘坐对象乘坐实例的PK。 你当然需要写RideSerializer才能工作。

+0

感谢您的回答。这个问题是,当我创建一个PendingRequest(POST)时,我把PK放在了骑行场中。我想继续这样做(POST与PK),当我发送获取 - 获取整个领域。这是可能的吗? –

+1

@OfekAgmon嗯,有几个选项,我认为所有的选择都不像我想要的那么流畅。 其中之一是对POST和GET使用不同的视图,并使用不同的序列化器,一个嵌套,一个没有嵌套。 另一个更肮脏的问题是在你的视图中决定调用哪个序列化程序......也取决于你使用的是通用视图还是基本APIView。 – Nadav

+0

@OfekAgmon另一个选择是保持原样(PK),并添加一个额外的字段,一个SerializerMethodField,它将以不同的字段名称返回骑乘对象。 – Nadav

相关问题