Как отловить ошибку при создании чата с двумя одинаковыми пользователями?

Я пытаюсь создать экземпляр чата в базе данных. Мне нужно отловить ошибку, когда создается комната с двумя одинаковыми пользователями. Вот мой chat-room models.py:

class UserRoom(models.Model):
class Meta:
    unique_together = ('user_one', 'user_two')

room_id = models.UUIDField(default=uuid.uuid4, primary_key=True)
user_one = models.ForeignKey('user.User', models.CASCADE, related_name='rooms_one')
user_two = models.ForeignKey('user.User', models.CASCADE, related_name='rooms_two')

def __str__(self):
    return f'{self.user_one} | {self.user_two} - {self.room_id}'

serializer.py:

    def create(self, validated_data):
    user_one = self.context.get('request').user
    user_two = validated_data['user_two']
    
    room = UserRoom.objects.create(user_one=user_one, user_two=user_two)
    message = ChatMessage.objects.create(
        chat_room=room,
        sender=user_one,
        text=validated_data['message']
    )
    return room

views.py:

@action(methods=['POST'], detail=False)
def create_chat(self, request):
    serializer = CreateChatSerializer(data=request.data,
                                       context=self.get_serializer_context())
    serializer.is_valid(raise_exception=True)
    a = serializer.save()
    return Response(
        UserRoomsSerializer(a, context=self.get_serializer_context()).data
    )

Также, мне нужно исключение создания существующей комнаты.

вы можете использовать .exists() для проверки существования комнаты в базе данных перед вызовом create

если комната существует, то возникает исключение проверки

например

serializer.py:

def create(self, validated_data):
   user_one = self.context.get('request').user
   user_two = validated_data['user_two']
   
   if UserRoom.objects.filter(user_one=user_one, user_two=user_two).exists():
       raise serializers.ValidationError("room name is not unique")

   room = UserRoom.objects.create(user_one=user_one, user_two=user_two)
   message = ChatMessage.objects.create(
    chat_room=room,
    sender=user_one,
    text=validated_data['message']
   )
   return room

и в вашем views.py проверьте наличие ошибок валидации

@action(methods=['POST'], detail=False)
def create_chat(self, request):
    serializer = CreateChatSerializer(data=request.data,
                                   context=self.get_serializer_context())
    if serializer.is_valid():
        a = serializer.save()
        return Response(
            UserRoomsSerializer(a, context=self.get_serializer_context()).data
        )
    else:
        return Response(serializer.errors)
Вернуться на верх