Как отловить ошибку при создании чата с двумя одинаковыми пользователями?
Я пытаюсь создать экземпляр чата в базе данных. Мне нужно отловить ошибку, когда создается комната с двумя одинаковыми пользователями. Вот мой 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)