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