ปัญหาในการดึงรายการวัตถุที่เกี่ยวข้องใน Serilazier

ฉันมีสองรุ่นเช่น:

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. แต่รหัสที่ฉันใช้ 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"
    ]
  },
]

person user5594493    schedule 05.04.2016    source แหล่งที่มา


คำตอบ (1)


คุณต้องใช้ nested serializer ใน CarSerializer:

photos = CarImageSerializer(many=True, read_only=True)
person AKS    schedule 05.04.2016
comment
ใช่ ฉันพบว่าหลังจากผ่านไประยะหนึ่ง ตอนแรกฉันไม่ได้ใช้ Many=True เพียงคำถามเดียว ฉันสามารถใช้ซีเรียลไลเซอร์ตัวเดียวกันสำหรับ POST & PUT ได้ด้วยใช่ไหม - person user5594493; 05.04.2016
comment
โดยค่าเริ่มต้น ซีเรียลไลเซอร์ที่ซ้อนกันจะอ่านได้อย่างเดียว สำหรับรายละเอียดเพิ่มเติม คุณสามารถดูคำตอบอื่นของฉันได้ที่นี่ - person AKS; 05.04.2016