ModelSerializer โดยใช้คุณสมบัติของโมเดล


101

ฉันกำลังพยายามทำให้เป็นอนุกรมของโมเดลที่มีฟิลด์คุณสมบัติที่ฉันต้องการทำให้เป็นอนุกรมด้วย

Models.py:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    slug = models.AutoSlugField(populate_from='name')

    @property
    def ext_link(self):
        return "/".join([settings.EXT_BASE_URL, self.slug])

serializers.py:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

เมื่อพยายามเข้าถึง URL ที่เกี่ยวข้องฉันได้รับข้อยกเว้นของ Serializer (KeyError) ในext_linkคุณสมบัติ

ฉันจะทำให้ext_linkทรัพย์สินเป็นอนุกรมได้อย่างไร?

คำตอบ:


138

เนื่องจากไม่ใช่ฟิลด์โมเดลจึงจำเป็นต้องเพิ่มอย่างชัดเจนในคลาสซีเรียลไลเซอร์

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.Field()

    class Meta:
        model = MyModel
        fields = ('name', 'ext_link')

5
หมายเหตุหนึ่ง : รายการฟิลด์ใน Meta เป็นทางเลือก หากคุณไม่ใส่fieldsในตัวอย่างข้างต้นคุณจะได้รับMyModelฟิลด์ทั้งหมดบวกext_linkในข้อมูลซีเรียล และนี่ยอดเยี่ยมมากสำหรับโมเดลที่ซับซ้อน! แก้ไข : djangorestframework==2.3.14อย่างน้อยนี้เป็นจริงสำหรับ
e.thompsy

สำหรับฉันการใช้ serializers ฟิลด์ให้ข้อผิดพลาด "serializers.ReadOnlyField" จะทำงานหากไม่ได้กำหนด to_representation และมุมมองเป็นแบบอ่านอย่างเดียว
Shashank Singla

15
ฉันใช้ 3.3.x และการเพิ่มคุณสมบัติลงในฟิลด์นั้นไม่เพียงพอ ฉันยังคงต้องเพิ่มอย่างชัดเจนผ่าน ext_link = serializers.ReadOnlyField ()
jarmod

4
โดยใช้ DRF 3.4.6 บน Python 3.5.1 และ Django 1.10 การเพิ่มลงในฟิลด์ก็ใช้ได้ดี
Vaibhav Mishra

9
หมายเหตุ: การใช้fields = "__all__"ฉันต้องเพิ่มmyfield = serializers.ReadOnlyField()ตามที่ระบุ jarmod โดยใช้เวอร์ชัน 3.7.7
Robert Townley

22

ตาม@Robert Townleyความคิดเห็นนี้ใช้ได้กับเวอร์ชัน3.8.2:

class MyModelSerializer(serializers.ModelSerializer):
    ext_link = serializers.ReadOnlyField()

    class Meta:
        model = MyModel
        fields = "__all__"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.