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でインポートエラーが発生します。
私はここで何が欠けていますか?どのようにしてモデルメソッドから返された直列化オブジェクトを、モデルの対応するシリアライザにフィールドとして含めることができますか?
あなたがここに円形のインポートを持っています。この問題を解決すると、両方のシリアライザを1つの場所に移動するか、別のシリアライザを作成するかのいずれかになります。ドライバをシリアル化しようとすると、トラブルが発生します。運転手との旅行で...。 – iulian