2016-08-03 5 views
0

Ich machte Django-Projekt über DRF.In DRF (django-rest-framework), wenn das Modell zwei Fremdschlüsselfelder hat, ist es möglich, zu serialisieren?

Auf meinem Ringen mit DRF, ich wundere mich, dass es möglich ist, diese Modelle zu serialisieren.

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 

Es gibt zwei ForeignKey Feld in Kommentar-Modell, ich denke, es vielleicht der Grund serializer.py ist sehr schwer zu behandeln.

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) 

Ich dachte comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True) auch in class PostSerializer(serializers.ModelSerializer): platziert werden, aber wenn ich, wie ich platziert dachte, da kommt Fehler AssertionError at /posts/ The field 'comments' was declared on serializer PostSerializer, but has not been included in the 'fields' option. so, wenn ich in ther Feld 'Kommentare' setzen wie

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

dann ist ->AttributeError at /posts/ 'Post' object has no attribute 'comments' aufgetreten.

Was ist meine Schuld?

Weil ich will, android app machen, dass Benutzer einen Beitrag und Kommentare lesen können ‚verwandte mit dem Posten‘ zur gleichen Zeit (wie fast Community-Websites, reddit, Facebook ...), serializers.py i geschrieben ist nicht genug. serializers.py ich gepostet ist scheint nicht ausreichend für die Beziehung zwischen Post und Kommentar zu reflektieren.

Gibt es ein Problem mit dem Kommentarmodell? Oder liege ich falsch?

Ich bin neu, Anfänger bei der Programmierung, Bitte lehre mich.

Danke fürs Lesen.

Antwort

2

Es ist nichts falsch, Sie greifen nur auf die falschen Attribute. Wenn Sie Ihre Modelle aussehen, definieren Sie einen ähnlichen Namen-Beiträge:

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

Also, wenn Sie Ihre Serializer schreiben, das „Feld“ sollten Sie zugreifen sollten die entsprechenden Namen anstelle Kommentare sein. Ändern Sie den Serializer:

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

Thank you! Es klappt! – touchingtwist