【问题标题】:Issues in fetching List of related objects in Serilazier在序列化程序中获取相关对象列表的问题
【发布时间】:2016-04-05 10:02:17
【问题描述】:

我有两个模型,例如:

class Car(models.Model):
    name = models.CharField(max_length=255)

class CarImage(models.Model):
    car = models.ForeignKey(Car, related_name='photos')
    photo = models.ImageField(upload_to='car/')

我想从上面的模型中获取汽车的所有图像。所以我写我的 serailzer 如下:

class CarSerializer(serializers.ModelSerializer):
    """
    """
    _id = serializers.ReadOnlyField(source='pk')

    photos = serializers.RelatedField(many=True, read_only=True)

    class Meta:
        model = Car
        fields = ('my_field_here', )

class CarImageSerializer(serializers.ModelSerializer):
    """

    """
    _id = serializers.ReadOnlyField(source='pk')

    class Meta:
        model = CarImage
        fields = ('my_field_here', )

但在CarSerializer 序列化程序照片字段中出现此错误RelatedField.to_representation() must be implemented for field . If you do not need to support write operations you probably want to subclassReadOnlyFieldinstead. 但是 id 我使用 PrimaryKeyRelatedField 而不是 RelatedField 然后它工作正常,我正在获取主键列表,但我想要所有字段。

我也尝试使用CarImageSerializer

Carserializer 声明

assets_keys = serializers.SerializerMethodField()
def get_assets_keys(self, obj):
    return AssetKeySerializer(obj.asset_keys.all(), context=self.context).data

但它不能序列化资产键列表,它需要单个对象。

所以我的问题是是否可以使用序列化程序获取相关对象数据。如果是,我需要在我的序列化程序中更正什么?

我的回复一定是这样的:

[
  {
    "_id": 1,
    "name": "first",
    "photos": [
      "name":"xyz",
      "photo":"path_to_photo"
    ]
  },
   {
    "_id": 1,
    "name": "second",
    "photos": [
      "name":"abcddd",
      "photo":"path_to_photo"
    ]
  },
]

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你需要在CarSerializer中使用nested serializer

    photos = CarImageSerializer(many=True, read_only=True)
    

    【讨论】:

    • 是的,一段时间后我发现,最初我没有使用 Many=True,只是再问一个问题,我也可以使用相同的序列化程序进行 POST 和 PUT 对吗?
    • 默认嵌套的序列化器是只读的。更详细的可以看我的另一个回答here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多