【问题标题】:How to use ManyToManyField in Django serializer?如何在 Django 序列化程序中使用 ManyToManyField?
【发布时间】:2020-07-07 18:19:18
【问题描述】:

我创建了一个模型,我在一个字段中使用 ManyToMany:

class Hospitals(models.Model):
    name = models.CharField(max_length=100, blank=False, null=False)

class HealthProduct(models.Model):
    hospital_list = models.ManyToManyField(Hospitals)
    ..
    ..

序列化器

hospital_field = serializers.SlugRelatedField(slug_field='id', queryset=Hospitals.objects.all(), many=True)

class HealthProductSerializers(serializers.ModelSerializer):
    hospital_list = hospital_field

    class Meta:
        model = HealthProduct
        exclude = ("created_at", "updated_at")

这里我将一个 Hospital_object id 列表传递给我的序列化程序

{
    "hospital_list": [1, 2],
    ..    
}

当我保存序列化数据得到响应时

{
    "hospital_list": [
        1,
        2
    ]
    ...
}

但我想获得保存的响应,例如:

{
    "hospital_list": [
            {
                "id": 1,
                "name": "Apollo Bangalore Cradle Ltd."
            },
            {
                "id": 2,
                "name": "Greenview Healthcare Pvt. Ltd."
            }
    ]
    ...
}

{
    "hospital_list": [
            "Apollo Bangalore Cradle Ltd.",
            "Greenview Healthcare Pvt. Ltd."
    ]
    ...
}

当我使用时:

hospital_list = HospitalSerializer(read_only=True, many=True)

然后我收到了对已保存对象的期望响应,我在第一个响应中提到了。

我应该如何在我的序列化程序中使用 ManyToMany 字段来保存和获取所需格式的响应?

【问题讨论】:

    标签: django django-rest-framework django-serializer active-model-serializers


    【解决方案1】:

    试试这个

        class HospitalsSerializer(serializers.ModelSerializer):
            class Meta:
                model = Hospitals
                fields = '__all__'
        
        class HealthProductSerializers(serializers.ModelSerializer):
            hospital_list = HospitalsSerializer(many=True)
        
            class Meta:
                model = HealthProduct
                exclude = ("created_at", "updated_at")
    
    

    基本上嵌套对象需要自己的序列化器进行序列化

    【讨论】:

    • 需要注意的一点是,如果您在后台使用OneToOneFieldForeignKeyManyToManyField,它将使用PrimaryKeyRelatedField,因此您得到的结果与primary key 交易。如果您想覆盖它,您可以明确提及serializer 的名称,如图所示。
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 2021-11-20
    • 2016-04-27
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2022-01-11
    相关资源
    最近更新 更多