Как получить доступ к атрибуту сериализатора из метода без аргумента 'attrs'
Я пытаюсь получить доступ к атрибуту participants в моем сериализаторе беседы из метода 'get_other_user'. Мой атрибут participants возвращает список словарей пользователей.
Однако, когда я запускаю код, я получаю, что у модели нет атрибута 'participants'. Я предполагаю, что мне нужно передать аргумент 'attrs' в метод 'get_other_user' (аналогичный методу 'def validate(self, attrs)'), а затем использовать attrs.get('participants). Однако я не знаю, как заполнить параметр attrs при вызове этого метода в моем методе get_other_username.
Любой совет будет принят с благодарностью. Спасибо!
class ConversationSerializer(serializers.ModelSerializer):
other_username = serializers.SerializerMethodField(method_name='get_other_username', read_only=True)
other_user_email = serializers.SerializerMethodField(method_name='get_other_user_email', read_only=True)
# latest_message = serializers.SerializerMethodField(method_name='get_latest_message', read_only=True)
participants = UsersSerializer(many=True, read_only=True)
class Meta:
model = Conversation
fields = ['conversation_id' ,'participants','other_username', 'other_user_email']
def get_current_user_id(self):
user_id = self.context['current_user'].id
return user_id
def get_other_user(self):
current_user_id = self.get_current_user_id()
for participant in self.participants:
if participant['id'] != current_user_id:
return participant
def get_other_username(self, obj):
other_user = self.get_other_user()
return other_user['username']
def get_other_user_email(self, obj):
other_user = self.get_other_user()
return other_user.email
Вы можете передать объект в качестве параметра в функцию поля метода и выполнить итерацию по нему. Обычно я использую поля методов с функциями, заполняющими их, просто используя шаблон get_{FIELD_NAME}.
class ConversationSerializer(serializers.ModelSerializer):
other_username = serializers.SerializerMethodField(read_only=True)
participants = UsersSerializer(many=True, read_only=True)
class Meta:
model = Conversation
fields = [
"participants",
"other_username",
]
def get_current_user_id(self):
user_id = self.context["current_user"].id
return user_id
def get_other_username(self, obj):
current_user_id = self.get_current_user_id()
for participant in obj.participants.all():
if participant.id != current_user_id:
return participant
Это вернет первого пользователя, который не является запрашивающим пользователем, если вы можете вести разговор между более чем 2 людьми, возможно, вам нужно сделать некоторые изменения.