0

Je vais être aussi simple que possible:désérialisation un modèle avec un champ supplémentaire

J'ai un modèle Challenge, qui contient des informations sur un certain défi et le montant des scores qu'il donne. N'importe quel User peut avoir plusieurs Submissions pour un défi donné. Lorsque vous interrogez un Challenge spécifique, je veux revenir JSON avec l'information du Défi ainsi que le score maximum qui a marqué le request.user actuel. Existe-t-il un moyen de doper en quelque sorte (attacher) la valeur à l'instance du modèle et la sérialiser avec une classe Serializer donnée?

Ce que j'ai trouvé est que ModelSerializer exige que le modèle ait ce champ lui-même, où dans mon cas je l'ajoute dynamiquement.

Ce qui est une bonne approche de ce problème et a tout le monde avait des problèmes similaires?

Répondre

0

cela peut être fait en accédant à la request.user dans le contexte de sérialiseur supplémentaire.

Dans les vues génériques du modèle sérialiseur est fourni avec le contexte supplémentaire. Ce contexte a l'objet de requête.

vous pouvez définir un champ de méthode sur votre Défi sérialiseur

class ChallengeSerializer(serializers.ModelSerializer): 
    user_max_score = serializers.SerializerMethodField() 

    class Meta: 
     model = Challenge 
     fields = '__all__' 

    def get_user_max_score(self, obj): 
     user_max_score = 0 
     request = self.context.get('request', None) 
     if request: 
      user = request.user 
      # get the user's max score 
      ... 
     return user_max_score 

Vous pouvez fournir un contexte supplémentaire aussi si vous n'utilisez pas les vues génériques. En savoir plus ici: http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context