Que ce soit bon ou non, il y a des moments où vous voulez accéder aux informations de vue à partir du sérialiseur. Nous utilisons un Mixin pratique qui peut être utilisé dans de tels cas en interne. Plus vous en faites, plus le lien entre View et Serializer est fort, nous vous recommandons donc de suivre l'utilisation et le dosage __.
Quoi qu'il en soit, c'est le code source.
ViewAccessSerializerMixin
class ViewAccessSerializerMixin(object):
def get_view_action(self):
"""
Accéder à l'action Afficher à partir du sérialiseur
"""
context = getattr(self, 'context')
if not context:
warnings.warn('Le contexte n'existe pas dans le sérialiseur. L'instance est créée de manière illégale')
return None
return context.get('view').action
def get_view_kw(self, key, default=None):
"""
Accéder aux kwargs de vue depuis Serializer
"""
context = getattr(self, 'context')
if not context:
warnings.warn('Le contexte n'existe pas dans le sérialiseur. L'instance est créée de manière illégale')
return default
return context.get('view').kwargs.get(key, default)
def get_kwargs_object(self, key, model_class):
"""
Accédez aux kwargs depuis le sérialiseur, considérez-le comme un identifiant et recherchez le modèle spécifié
"""
obj = model_class.objects.get_or_none(id=int(self.get_view_kw(key, 0)))
if obj:
return obj
Principalement utilisé dans validation
. Je pense qu'il y a probablement de meilleures conditions. Comme ça.
class HogeSerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):
#Diverses omissions
def validate(self, attrs):
#Modifier le contenu de la vérification en fonction de l'action
action_name = self.get_view_action()
if action_name == "xxxx":
pass
else:
pass
Principalement utilisé dans SerializerMethodField.
class PostHistorySerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):
#Diverses omissions
comments = serializers.SerializerMethodField()
def get_comments(self, obj):
return obj.comment.filter(user_id=self.get_view_kw("user_pk"))
C'est proche de la combinaison de ↑, mais c'est un raccourci.
class UserSerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):
#Diverses omissions
def validate(self, attrs):
user = self.get_kwargs_object('user_pk', models.User)
if user.is_ban():
raise NotFound()
pass
En gros, je l'utilise comme ça. J'espère que vous pourrez l'utiliser facilement.
Recommended Posts