2017-11-19 25 views
0

私はDjango Rest Frameworkを使用してREST APIを作成しています。マイシリアライザ:Django Rest Frameworkでの外部キー値の取得

class ItemSerializer(serializers.ModelSerializer): #inherit from this class 
    owner = serializers.ReadOnlyField(source='user.id') 

    class Meta: 
     model = Item 
     fields = ('id','name', 'owner') 


class UserSerializer(serializers.ModelSerializer): 
    items = serializers.PrimaryKeyRelatedField(many=True, queryset=Item.objects.all()) 

    class Meta: 
     model = User 
     fields = ('id', 'username', 'items') 

のみモデル:今すぐ

class Item(models.Model): 
    name = models.CharField(max_length=10) 
    id = models.AutoField(primary_key=True) 
    owner = models.ForeignKey('auth.User', related_name='items', on_delete=models.CASCADE) 

    def __str__(self): 
     return self.name 

私は、ユーザーGET場合:

HTTP 200 OK 許可:GET、HEAD、OPTIONS のContent-Type:アプリケーション/ json 可変:受け入れる [ { "id":1、 "ユーザー名": "チャック"、 "アイテム":[ 1、] } ]

私は私が得ることができる方法によって、(このユーザーが持っているすべてのアイテムを受け取る

アイテムの主キーの代わりに名前?)。

このプロセスを逆にしてオブジェクトの所有者をすべて取得したい場合、どうすればいいですか?ここで私はこれまでの(所有者が不足している)している応答です:

HTTP 200 OK 許可:GET、POST、HEAD、OPTIONS のContent-Type:アプリケーション/ JSON は異なります [ { を受け入れます"ID":1、 "名前": "ベスト" }、{ "ID":2、 "名前": "パンツ" }] `

私はあなたのコード(コメント部分)に見ることができるようowners = serializers.ReadOnlyField(source='owner')を追加しようとしましたが、私は次のエラーを持っている:

Object of type 'User' is not JSON serializable

はあなたの助けをいただき、ありがとうございます。

答えて

1

あなたはほとんどそこにいます。あなたのItemSerializerで 、あなたはすべてのユーザー情報

1

を見たい場合は、主キーのかわりに項目の名前を受信したい場合は、あなただけの可能性

serializers.ReadOnlyField(source='owner.id') 

または

owner = UserSerializer() 

をお試しくださいitemsからStringRelatedFieldに変更し、次にItem__str__を使用します。

items = serializers.StringRelatedField(many=True) 

さらに良い解決策は、Nested relationshipです。あなたは、単に例えば、シリアライザ定義項目にitemsを変更します。

items = ItemSerializer(many=True, read_only=True) 

別の解決策は、あなたがownerを削除し、深さを定義することになります。この方法で所有者(ユーザー)に関するすべての情報がシリアライズされます。

class ItemSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Item 
     depth = 1 
     fields = ('id', 'name', 'owner') 

と逆のために今

class UserSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     depth = 1 
     fields = ('id', 'username', 'items') 

itemsのために、所有者との項目のリストが、それはModelSerializerでは不可能です。おそらく手動で行う必要があります。ここでは、シリアライザが不要な例を示します。このviewsetため

class ItemOwnerViewSet(viewsets.ViewSet): 

    def list(self, request): 
     data = [] 
     queryset = Item.objects.values('name', 'owner__username') 
     for item in queryset: 
      temp = dict() 
      t = next((i for i in data if i['name'] == item['name']), None) 
      if t: 
       t['owners'].append(item['owner__username']) 
      else: 
       temp['name'] = item['name'] 
       temp['owners'] = [item['owner__username']] 
       data.append(temp) 

     return Response(data) 

シリアライザはおそらく、これらの線に沿って何かのようになります。私はこのすべてをテストしていない

class ItemOwnerSerializer(serializers.Serializer): 

    name = serializers.CharField() 
    owners = serializers.ListField(child=serializers.CharField()) 

、私はそれが動作する必要がありますね。私はそれが助けて欲しい

関連する問題