Как получить доступ к атрибуту сериализатора из метода без аргумента '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 людьми, возможно, вам нужно сделать некоторые изменения.

Вернуться на верх