2016-10-05 8 views
0

コードDjangoの残りの枠組みの中でネストされたシリアライザ

私はこれらのモデルがあります:

class Activity(models.Model): 
    is_child_friendly = models.BooleanField() 
    free_wifi = models.BooleanField() 
    parking_avilable = models.BooleanField() 

class RouteOrdering(models.Model): 
    route_id = models.ForeignKey(Route, on_delete=models.CASCADE) 
    activity_id = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name='tracks') 
    day = models.IntegerField() 
    order = models.IntegerField() 

    class Meta: 
     ordering = ['order'] 

そして、これらのシリアライザ:

class ActivitySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Activity 

class RouteOrderingSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = RouteOrdering 
     fields = ('id','day','order','route_id','activity_id','tracks') 

は私がしたい問題をRouteOrderingシリアライザは、同じactivity_idを持つアクティビティも返します。このためには、ネストされたシリアライザを使うべきだと思いました。

は私が

を試してみた私はそうのようなネストされたシリアライザ追加しようとしました:

activity = ActivitySerializer(read_only=True) 

をしかし、これは、エンドポイントには出力を生じませんでした。私はこれがドキュメントに示されたユースケースではないことを知っています。これはおそらくそのノイジーな働きをする理由です。あなたは、次のコードをしようとしたときにエラーが発生しました、なぜ私はよく分からない

class ActivitySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Activity 

class RouteOrderingSerializer(serializers.ModelSerializer): 
    activity_id = ActivitySerializer() 
    class Meta: 
     model = RouteOrdering 
     fields = ('id','day','order','route_id','activity_id') 

答えて

1

病気は、これが

+0

お手数をおかけしていただきありがとうございます。それは仕事をしなかったし、 '活動'フィールドが表示されていないビューを返しました。他のアイデア? – idik

+0

これは非常に奇妙です。 'activity = ...'行や 'fields = ...'行を使わずに実行して、結果のjsonを投稿できますか? –

+0

ここにjsonという結果のペーストビンがあります:http:// pastebin。com/MKz4mDKB – idik

1

はこれを試してみてください:)行わ取得していきますどのようなコードを見て喜んでいます。私は_idという結末に関連するバグだと思っていましたが、実行するとすべて正常に動作します。

class ActivitySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Activity 

class RouteOrderingSerializer(serializers.ModelSerializer): 
    activity_id = ActivitySerializer(read_only=True) 
    class Meta: 
     model = RouteOrdering 
     fields = ('id','day','order','route_id','activity_id','tracks') 

あなたは、私はジャンゴでの関係のために_idで終わる名前を使用することはお勧めしませんことができますが。問題は、Djangoがすべての外部キーを内部で<relation_name>_idの下に格納していることです。これにより、<object>.<relation_name>_idを整数idに設定し、オブジェクトを保存することと対比して<object>.<relation_name>を関連オブジェクト全体に保存するなど、さまざまな良いことが可能になります(最初に取得するにはdbルックアップが必要な場合があります)。私がこの動作を直感的ではない1つの場所はシリアライザです。デフォルトでは、フィールドを明示的に宣言して<relation_name>フィールドを個別に削除またはネストすることはできますが、"<relation_name>_id": <id>の代わりに"<relation_name>": <id>という関係を表すことがデフォルトです。

あなたは末尾_idを持っていないし、あなたの関係の名前を変更する場合は、次のように動作します:

class ActivitySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Activity 

class RouteOrderingSerializer(serializers.ModelSerializer): 
    activity = ActivitySerializer(read_only=True) 
    class Meta: 
     model = RouteOrdering 
     fields = ('id','day','order','route_id','activity','tracks') 

は(route代わりのroute_idを宣言すると、デフォルトの動作に合わせてより多くの、しかしではあまり明らかであることに注意してください私の意見)

+0

私はこのエラーが発生します: 'int()引数は、おそらくactivity_idがintであることを前提としているため、文字列、バイトのようなオブジェクトまたは数字でなければならず、 'collections.OrderedDict'何か案は? – idik

+0

このエラーを再現できないようです。どのようなDjango/Django-Rest-Frameworkバージョンがありますか? –

関連する問題