2016-08-03 11 views
0

私はDRFでdjangoプロジェクトを作った。DRF(django-rest-framework)では、モデルにforeignkeyfieldが2つある場合、シリアル化できますか?

私がDRFに苦労しているうちに、これらのモデルをシリアライズすることができるのは不思議です。

models.py

class Post(models.Model): 
    author = models.ForeignKey(User, related_name='related_postwriter') 
    title = models.CharField(max_length=200, blank = False) 
    text = models.TextField(blank = True) 
    created_date = models.DateTimeField(
     default=timezone.now 
     ) 
    point = models.PointField(null=False, blank=True) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.title 

class Comment(models.Model): 
    post = models.ForeignKey('blog.Post', related_name='related_comments') 
    author = models.ForeignKey(User, related_name='related_commentwriter') 
    text = models.TextField(max_length=500) 
    created_date = models.DateTimeField(default=timezone.now) 

    def __str__(self): 
     return self.text 

2つのForeignKeyフィールドがコメントモデルであり、私はそれは多分serializer.pyが対処するのは非常に困難である理由だと思います。

serializers.py

class UserSerializer(serializers.ModelSerializer): 
    posts = serializers.PrimaryKeyRelatedField(many=True, read_only=True) 
    comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True) 
    class Meta: 
     model = User 
     fields = ('id', 'username', 'email', 'posts') 

class PostSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Post 
     fields = ('id', 'author', 'title', 'text', 'point') 
    def create(self, validated_data): 
     validated_data['author'] = self.context['request'].user 
     return super(PostSerializer, self).create(validated_data) 


class CommentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Comment 
     fields = ('id', 'post', 'author', 'text') 
    def create(self, validated_data): 
     validated_data['author'] = self.context['request'].user 
     return super(CommentSerializer, self).create(validated_data) 

私はcomments = serializers.PrimaryKeyRelatedField(many=True, read_only=True)class PostSerializer(serializers.ModelSerializer):に配置する必要があるが、私は思った通り、私が置かれたとき、私はTHERフィールドでのコメント」を入れたときに、エラーAssertionError at /posts/ The field 'comments' was declared on serializer PostSerializer, but has not been included in the 'fields' option.がとてもが来ると思いました〜AttributeError at /posts/ 'Post' object has no attribute 'comments'が発生する。

私の責任は何ですか?

私は、ユーザーが投稿を読んで「投稿と関連している」とコメントすることができます(ほとんどのコミュニティのウェブサイト、レッド、フェイスブックなど)。serializers.py posted is十分ではない。 serializers.py投稿された投稿とコメントの関係を反映するのに十分ではないようです。

コメントモデルに問題はありますか?または私は間違っていますか?

私はプログラミングで初心者です、教えてください。

読んでいただきありがとうございます。

答えて

2

間違ったことはなく、間違った属性にアクセスしているだけです。あなたのモデルを見れば、あなたはポストに関連する名前を定義します。

post = models.ForeignKey('blog.Post', related_name='related_comments')

だから、あなたはあなたのシリアライザを書くとき、あなたがアクセスしなければならない「フィールド」は、関連名の代わりにコメントする必要があります。シリアライザを変更します。

class PostSerializer(serializers.ModelSerializer): 
    related_comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True) 
    class Meta: 
     model = Post 
     fields = ('id', 'author', 'title', 'text', 'point', 'related_comments') 
+0

ありがとう使用することができます!できます! – touchingtwist