首页 > 解决方案 > Django REST ManyToManyField 使用序列化器获取相关值

问题描述

我是 Django 的新手。我已经搜索了整个stackoverflow,但确实得到了任何相关的东西。

我有两个表所有者和服务。所有者可以选择 N 个服务。我正在使用 ManyToManyField,我想在通用视图中获取相关值。可能可以使用 prefetch_related 函数来实现,但我不知道如何。我想要如下所示的输出。谁能帮我实现低于预期的输出。谢谢

预期产出

[
    {
        "owner_id": 1,
        "first_name": "james",
        "last_name": "cook",
        "services_id": [
               [1, service_title, desc],
               [2, service_title, desc],
               [3, service_title, desc]
        ]
    }
]

模型.py

class services(models.Model):   
   service_id=models.IntegerField(primary_key=True)
   title=models.CharField(max_length=200)
   description=models.TextField()
   type=models.PositiveSmallIntegerField() #1: Package; 2: A La Carte
   status=models.PositiveSmallIntegerField(default=1)

class reservations(models.Model):
   owner_id=models.IntegerField()
   first_name=models.CharField(max_length=50)
   last_name=models.CharField(max_length=50)
   services_id=models.ManyToManyField(services, related_name='services')

序列化程序.py

class servicesSerializer(ModelSerializer):
    class Meta:
        model=services
        fields = [
            'service_id'
            'title',
            'description',
            'type',
        ]


class ownerSerializer(ModelSerializer):
    class Meta:
        model=reservations
        fields = [
        'owner_id',
        'first_name',
        'last_name',
        'services_id',
        ]

视图.py

class upcomingServices(ListAPIView):
 queryset = owner.objects.all()
 serializer_class=ownerSerializer

输出

[
{
    "owner_id": 1,
    "first_name": "james",
    "last_name": "cook",
    "services_id": [
        1,
        2,
        3
    ]
}
]

标签: djangodjango-rest-framework

解决方案


在你的使用这个ServicesSerializer

class servicesSerailizer(ModelSerializer):
        class Meta:
            model=services
            fields = [
                'service_id'
                'title',
                'description',
                'type',
            ]

        def to_representation(self, value):
            return [value.pk, value.title, value.description]

并将其添加到您的ownerSerializer

class ownerSerializer(reservationSerailizer):
    service_id = servicesSerializer(many=True, read_only=True)
    class Meta:
        model=reservations
        fields = [
            'owner_id',
            'first_name',
            'last_name',
            'services_id',
             ]

这里的文档


推荐阅读