Django ManyToMany字段为json格式

nik*_*las 0 python django json

我正在尝试以json格式获取数据。我有一个ManyToMany领域正在返回id。但我也需要该内容。这是我的models.py

class Pricing(models.Model):
    name = models.CharField(max_length = 100)
    price = models.CharField(max_length = 100)

    def __str__(self):
        return self.name+' and '+self.price


class Service(models.Model):
    name = models.CharField(max_length=100)
    price = models.ManyToManyField(Pricing, blank=True)

    def __str__(self):
        return self.name 
Run Code Online (Sandbox Code Playgroud)

还有views.py返回json格式数据的

def all_service_json(request, name):
    data = serializers.serialize("json", Service.objects.filter(name__icontains=name))
    return HttpResponse(data)
Run Code Online (Sandbox Code Playgroud)

现在获取如下输出

[
    {
        "model": "myapp.service", 
        "pk": 2, 
        "fields": 
        {
            "name": "Service name", 
            "price": [1, 2]
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

但想像下面

[
    {
        "model": "myapp.service", 
        "pk": 2, 
        "fields": 
        {
            "name": "Service name", 
            "price": 
            {
                1: "Price 1", 
                2: "Price 2"
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

Rob*_*ley 6

在Django Rest Framework中创建ModelSerializer对象将使您显示嵌套的对象数据:

http://www.django-rest-framework.org/api-guide/serializers/#dealing-with-nested-objects

# myapp/serializers.py
...
from rest_framework import serializers

class PricingSerializer(serializers.ModelSerializer):

    class Meta:
        fields = '__all__'
        model = Pricing

class ServiceSerializer(serializers.ModelSerializer):
    price = PricingSerializer(read_only=True, many=True)

    class Meta:
        fields = '__all__'
        model = Service

# myapp/views.py
def all_service_json(request, name):
    services = Service.objects.filter(name__icontains=name)
    data = ServiceSerializer(services, many=True).data
    return HttpResponse(data)
Run Code Online (Sandbox Code Playgroud)