2016-06-21 10 views
0

Ich habe zwei Modelle (Like und News). Ich verwende Django-Rest-Framework, um daraus eine Web-API zu erstellen.django rest framework ein benutzerdefiniertes Objekt zurückgeben

Modelle:

class Like(models.Model): 
    user = models.ForeignKey(User) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 
    pub_date = models.DateTimeField(default=timezone.now) 

class News(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=150) 
    ... 
    likes = GenericRelation(Like) 

Serializer für die beiden Modelle:

class LikeObjectRelatedField(serializers.RelatedField): 
    def to_representation(self, value): 
     if isinstance(value, User): 
      return 'User: ' + value.username 
     elif isinstance(value, News): 
      return 'News: ' + value.title 
     ... 
     raise Exception('Unexpected type of tagged object') 

class LikeSerializer(serializers.ModelSerializer): 
    user = UserSerializer() 
    content_object = LikeObjectRelatedField(read_only=True) 

    class Meta: 
     model = Like 
     field = ('user', 'content_object', 'pub_date') 

class NewsSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer() 
    likes = LikeSerializer(many=True) 

    class Meta: 
     model = News 
     fields = ('user', 'title', 'body', 'article_image', 'pub_date', 'likes') 

Ansicht:

class NewsViewSet(viewsets.ModelViewSet): 
    queryset = News.objects.all().order_by('-pub_date') 
    serializer_class = NewsSerializer 

Damit bekommen ich die JSON-Objekte. Aber für das News-Objekt möchte ich nur die Anzahl der Likes für eine Nachricht und überprüfe, ob request.user in der Likes-Liste dieser Nachricht vorhanden ist. Stattdessen erhalte ich alle Benutzer (und die Benutzerinformationen) und likes Inhalt-Objekt, wieder die Benutzer usw.

Wenn ich ein benutzerdefiniertes Feld für das Like im NewsSerializer verwenden, kann ich die Nummer bekommen von Likes. Aber ich kann nicht überprüfen, ob der request.user in der Likes-Liste ist.

class LikeRelatedField(serializers.RelatedField): 
    def to_representation(self, value): 
     return value.count() 

Was mache ich, um nur die Anzahl der Likes für ein News-Objekt zu erhalten. Überprüfen Sie auch, ob die request.user in dieser Likes-Liste ist und fügen Sie möglicherweise einen booleschen Wert von user_in_likes:True oder False für jedes News-Objekt hinzu?

Antwort

0

Sie sollten SerializerMethodField anstelle von benutzerdefinierten Feld verwenden. Auf diese Weise können Sie in der Serializer-Methode auf request bis self.context['request'] zugreifen und alle Berechnungen Ihres Like Modells durchführen.

Verwandte Themen