0

DRF初心者はこちらです。DRF:モデルメソッドからシリアル化されたオブジェクトをフィールドとしてシリアライザに含めるにはどうすればいいですか?

私は学校プロジェクト用のAPIを構築しようとしています。私のプロジェクトツリーにはいくつかのアプリケーションが含まれていて、1つはプロファイルで、もう1つはTripです。

profiles.modelsには、DriverおよびDriverSessionモデルが含まれます。 trips.modelsには旅行モデルが含まれます。

以下は、profiles.modelsで作成したDriverSessionモデルです。私はモデルメソッド 'get_active_trip'を追加して、対応するDriverSessionを取得したときにクライアントアプリケーションに存在する場合、ドライバのアクティブなトリップを返すことができます。それが存在しない場合、私はトリップフィールドが依然としてレスポンスに含まれ、値がNoneであることを望みます。ここで

class DriverSession(models.Model): 
    driver = models.ForeignKey(Driver) 
    vehicle = models.ForeignKey(Vehicle) 
    start_timestamp = models.DateTimeField(auto_now_add=True) 
    end_timestamp = models.DateTimeField(null=True, blank=True) 

    class Meta: 
     verbose_name = 'DriverSession' 
     verbose_name_plural = 'Driver Sessions' 

    # Model method to get active trip of the driver 
    def get_active_trip(self): 

     try : 
      trip = Trip.objects.get(driver_session=self, Q(status='DI') | Q(status='OT')) 
     except Trip.DoesNotExist : 
      return None 
     else : 
      return trip 

は、私がprofiles.modelsにDriverSessionモデル用に作成したシリアライザです:

from trips.serializers import TripSerializer 

class DriverSessionSerializer(serializers.ModelSerializer): 
    """ 
    Serializer class for DriverSession Model. 
    """ 

    driver = DriverSerializer(read_only=True) 
    driver_id = serializers.IntegerField(write_only=True) 

    vehicle = VehicleSerializer(read_only=True) 
    vehicle_id = serializers.IntegerField(write_only=True) 

    start_timestamp = serializers.DateTimeField(read_only=True,format='%Y-%m-%d %H:%M:%S') 
    end_timestamp = serializers.DateTimeField(required=False, allow_null=True, format='%Y-%m-%d %H:%M:%S') 

    trip = TripSerializer(source='get_active_trip', read_only=True) 

    class Meta: 
     model = DriverSession 
     fields = ('id', 
        'driver', 
        'driver_id', 
        'vehicle', 
        'vehicle_id', 
        'start_timestamp', 
        'end_timestamp', 
        'trip') 

そして、これはtrips.modelsで私の旅のモデルの部分図である。

class Trip(models.Model): 
    rider = models.ForeignKey('profiles.Rider') 
    driver_session = models.ForeignKey('profiles.DriverSession', null=True, blank=True) 
    .... 
    .... 

最後にtrips.serializersのトリップモデル用に作成したシリアライザクラスの部分的な表示を次に示します:

from profiles.serializers import DriverSessionSerializer 

class TripSerializer(drf_serializers.ModelSerializer): 
    """ 
    Serializer class for Trip model 
    """ 
    .... 
    .... 


    driver_session = DriverSessionSerializer(read_only=True) 
    driver_session_id = drf_serializers.IntegerField(write_only=True, required=False, allow_null=True) 

    .... 
    .... 

コマンド 'runserver'を実行しようとすると、profiles.serializersをインポートできないtrips.serializersでインポートエラーが発生します。

私はここで何が欠けていますか?どのようにしてモデルメソッドから返された直列化オブジェクトを、モデルの対応するシリアライザにフィールドとして含めることができますか?

+0

あなたがここに円形のインポートを持っています。この問題を解決すると、両方のシリアライザを1つの場所に移動するか、別のシリアライザを作成するかのいずれかになります。ドライバをシリアル化しようとすると、トラブルが発生します。運転手との旅行で...。 – iulian

答えて

0

実際のエラーメッセージ、設定ファイル、またはプロファイルシリアライザは含まれていません。しかしあなたの説明から、インストールしたアプリに「プロフィール」を含めなかった可能性があります。

1

あなたは、このようないくつかのコードを実行する必要があり あなたserilizerにカスタムフィールドを追加したい:

class FooSerializer(serializers.ModelSerializer): 
    my_field = serializers.SerializerMethodField('is_named_bar') 

    def is_named_bar(self, foo): 
     return foo.name == "bar" 

    class Meta: 
    model = Foo 
    fields = ('id', 'name', 'my_field') 

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

関連する問題