Unabhängig davon, ob dies gut ist oder nicht, gibt es Zeiten, in denen Sie über den Serializer auf Ansichtsinformationen zugreifen möchten. Wir verwenden ein praktisches Mixin, das in solchen Fällen intern verwendet werden kann. Je mehr Sie tun, desto stärker ist die Bindung zwischen View und Serializer. Wir empfehlen daher, die Verwendung und Dosierung __ zu befolgen.
Wie auch immer, es ist der Quellcode.
ViewAccessSerializerMixin
class ViewAccessSerializerMixin(object):
def get_view_action(self):
"""
Zugriff auf View-Aktion über Serializer
"""
context = getattr(self, 'context')
if not context:
warnings.warn('Der Kontext ist im Serializer nicht vorhanden. Die Instanz wird auf illegale Weise erstellt')
return None
return context.get('view').action
def get_view_kw(self, key, default=None):
"""
Greifen Sie über Serializer auf View Warwar zu
"""
context = getattr(self, 'context')
if not context:
warnings.warn('Der Kontext ist im Serializer nicht vorhanden. Die Instanz wird auf illegale Weise erstellt')
return default
return context.get('view').kwargs.get(key, default)
def get_kwargs_object(self, key, model_class):
"""
Greifen Sie über den Serializer auf kwargs zu, betrachten Sie es als ID und suchen Sie nach dem angegebenen Modell
"""
obj = model_class.objects.get_or_none(id=int(self.get_view_kw(key, 0)))
if obj:
return obj
Wird meistens bei der Validierung verwendet. Ich denke, es gibt wahrscheinlich bessere Bedingungen. So was.
class HogeSerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):
#Verschiedene Auslassungen
def validate(self, attrs):
#Ändern Sie den Überprüfungsinhalt abhängig von der Aktion
action_name = self.get_view_action()
if action_name == "xxxx":
pass
else:
pass
Wird hauptsächlich in SerializerMethodField verwendet.
class PostHistorySerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):
#Verschiedene Auslassungen
comments = serializers.SerializerMethodField()
def get_comments(self, obj):
return obj.comment.filter(user_id=self.get_view_kw("user_pk"))
Es ist nah an der Kombination von ↑, aber es ist eine Abkürzung.
class UserSerializer(ViewAccessSerializerMixin, serializers.ModelSerializer):
#Verschiedene Auslassungen
def validate(self, attrs):
user = self.get_kwargs_object('user_pk', models.User)
if user.is_ban():
raise NotFound()
pass
Grundsätzlich benutze ich es so. Ich hoffe, Sie können es bequem verwenden.