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?