【问题标题】:DRF : How to include serialized object that is returned from model method in serializer as a field?DRF:如何将序列化程序中模型方法返回的序列化对象作为字段包含在内?
【发布时间】:2016-09-24 03:23:17
【问题描述】:

DRF 新手在这里。

我正在尝试为学校项目构建 API。我的项目树包括几个应用程序,一个是 Profiles,另一个是 Trips。

profiles.models 包括 Driver 和 DriverSession 模型。 trips.models 包括旅行模型。

您可以在下面看到我在profiles.models 中创建的DriverSession 模型。我添加了一个模型方法“get_active_trip”,以便能够在检索相应的 DriverSession 时将驱动程序的活动行程(如果存在)返回给客户端应用程序。如果它不存在,我希望 trip 字段仍包含在响应中,值为 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 中为 Trip Model 创建的序列化程序类的部分视图:

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”时,在trips.serializers 中出现导入错误,其中任何profiles.serializers 都无法导入。

我在这里缺少什么?如何将模型方法返回的序列化对象包含在模型的相应序列化程序中作为字段?

【问题讨论】:

  • 这里有一个循环导入。解决这个问题,它会起作用(要么将两个序列化器移到一个地方,要么创建不同的序列化器。顺便说一下,当你试图序列化一个有一个 Trip 的驱动程序时,你会遇到麻烦,它有一个驱动程序和司机一起旅行...... .

标签: python django serialization django-models django-rest-framework


【解决方案1】:

您想将自定义字段添加到您的序列化程序 你必须做一些这样的代码:

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

【讨论】:

    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多