反向关系序列化DRF中访问@属性方法

Access @property method in reverse relation serialization DRF

我有这些型号:

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。 是否可以通过这种方式以反向关系访问 属性 方法?

由于外键关系,一个 Datas 模型可以有多个照片对象(应该是 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 文档中找到更多信息