【问题标题】:Access @property method in reverse relation serialization DRF在反向关系序列化 DRF 中访问 @property 方法
【发布时间】:2020-07-03 05:58:13
【问题描述】:

我有这些模型:

class Datas(BaseModel):
  path = models.CharField()
  folder = models.ForeignKey(folder, on_delete=models.CASCADE)


class Photos(BaseModel):
  data = models.ForeignKey('Datas', on_delete=models.CASCADE)
  name = models.CharField()

  @property
  def file_path(self):
    return urljoin(self.data.folder.url, quote(self.full_path))

这些数据模型的序列化器:

class DatasSerializer(serializers.ModelSerializer):
  path = serializers.CharField()
  file_url = serializers.SerializerMethodField()

  class Meta:
    model = Datas
    fields = (
      'id',
      'path',
      'folder',
      'file_url'
    )

  def get_file_url(self, obj):
    return Photos.file_path

我想要的是从照片模型中检索 file_path。 是否可以以这种方式反向访问属性方法?

【问题讨论】:

  • 是的,有可能,您需要获取“照片”表(实例)的实例,然后使用它 instance.file_path。

标签: python django django-rest-framework django-serializer


【解决方案1】:

由于 ForeignKey 关系,一个 Datas 模型可以有多个 Photos 对象(它应该是 Data,因为它已经是一个复数词了)。如果你想要最新的Photo,那么试试这样:

class DatasSerializer(serializers.ModelSerializer):
  path = serializers.CharField()
  file_url = serializers.SerializerMethodField()

  class Meta:
      model = Datas
      fields = (
          'id',
          'path',
          'folder',
          'file_url'
      )

    def get_file_url(self, obj):
        return obj.photos_set.last().file_path  # or `first()` to get the first object

如果你想要所有这些,那么你可以这样尝试:

class PhotoSerializer(serializers.ModelSerializer):
    file_url = serializers.Field()
    class Meta:
        model = Photos
        fields = ['file_url']

class DatasSerializer(serializers.ModelSerializer):
      path = serializers.CharField()
      photos = PhotoSerializer(read_only=True, many=True, source='photos_set')
      class Meta:
          model = Datas
         fields = ('id', 'path', 'folder', 'photos')

更多信息可以在reverse relations的DRF文档中找到:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 2020-03-24
    • 1970-01-01
    • 2020-07-04
    • 2018-07-05
    • 2022-12-11
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多