2017-11-21 9 views
0

私はjson形式としてデータを取得しようとしています。私はManyToManyフィールドを返しています。ちょうどidです。しかし、私もその内容が必要です。ここに私のmodels.pyジャンゴManyToManyフィールドとしてjson形式

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 

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

今すぐ

[ 
    { 
     "model": "myapp.service", 
     "pk": 2, 
     "fields": 
     { 
      "name": "Service name", 
      "price": [1, 2] 
     } 
    } 
] 

以下のような出力を取得しかし

[ 
    { 
     "model": "myapp.service", 
     "pk": 2, 
     "fields": 
     { 
      "name": "Service name", 
      "price": 
      { 
       1: "Price 1", 
       2: "Price 2" 
      } 
     } 
    } 
] 
以下のようにしたいJSON形式のデータを返している views.pyです

答えて

1

は、Djangoの残りのフレームワーク内から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) 
1

@robertは、ネストされたシリアライザを使用して説明したように、あなたの問題を解決します。

しかし、デフォルトでネストされたシリアライザは読み取り専用です。したがって、 がネストされたシリアライザフィールドへの書き込み操作をサポートしたい場合、 は、明示的に 子関係を保存する方法を指定するために、create()メソッドおよび/またはupdate()メソッドを追加する必要があります。

書き込み可能なサービスシリアライザ

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

    class Meta: 
     fields = '__all__' 
     model = Service 

    # sample create 
    def create(self, validated_data): 
     prices_data = validated_data.pop('price') 
     service = Service.objects.create(**validated_data) 
     for price_data in prices_data: 
      Price.objects.create(service=service, **price_data) 
     return service 

    # add update here 

myappに/ views.py

def all_service_json(request, name): 
    services = Service.objects.filter(name__icontains=name) 
    serializer = ServiceSerializer(services) 
    return HttpResponse(serializer.data) 
+0

通知してくれてありがとう – nikolas