У меня есть бэкэнд Django DRF с аутентификацией пользователя токена. Само приложение представляет собой чат, который состоит из общедоступных лобби и частных тем (потоков между конкретными пользователями). В настоящее время мой файл моделей содержит модель сообщений, которая имеет отношение внешнего ключа к моделям лобби и потоков и сохраняет одно из этих полей как пустое, чтобы определить, относится ли конкретное сообщение к частному потоку или общедоступному лобби.
Пока что у меня естьбыла сосредоточена на разработке общедоступных лобби, где пользователь запрашивал сообщения на основе лобби, в котором он находился.
После того, как я закончил разработку лобби и включил аутентификацию, веб-интерфейс прекратил фильтровать сообщения поЗаголовок лобби и просто продолжал просто возвращать мне все сообщения, относящиеся к текущему аутентифицированному пользователю - очевидно, не обращая внимания на любые различия между лобби, с которыми связаны сообщения. Изучив реальный API, я обнаружил, что при включении аутентификации опция фильтрации полностью исчезает со страницы.
how can I combat this issue?
РЕДАКТИРОВАТЬ : я обновил сообщение с некоторым кодом
Я бы предпочел оставить одну модель сообщений, а не создавать отдельные модели сообщений для лобби и потоков.
вот мои модели:
class Thread(models.Model):
user1 = models.ForeignKey(Account, on_delete=models.PROTECT, related_name="user1")
user2 = models.ForeignKey(Account, on_delete=models.PROTECT, related_name="user2")
date = models.DateTimeField(auto_now_add=True, blank=False)
def __repr__(self):
return f"user1: {self.user1} user2: {self.user2}"
class Message(models.Model):
content = models.TextField(max_length=255, default="", blank=False, null=False)
user = models.ForeignKey(Account, on_delete=models.PROTECT, related_name="user")
date = models.DateTimeField(auto_now_add=True, blank=False)
lobby = models.ForeignKey(Lobby, on_delete=models.CASCADE, related_name="messages", blank=True, null=True )
thread = models.ForeignKey(Thread, on_delete=models.CASCADE, related_name="messages", blank=True,
null=True )
class Lobby(models.Model):
title = models.TextField(max_length=90, blank=False, null=False)
thumb = models.ImageField(default='lobby.jpg')
вот сериализаторы:
class ThreadSerializer(serializers.ModelSerializer):
user1 = serializers.CharField(source="user1.username")
user1thumb = serializers.CharField(source="user1.accountimage.image.url")
user2 = serializers.CharField(source="user2.username")
user2thumb = serializers.CharField(source="user2.accountimage.image.url")
class Meta:
model= Thread
fields = ["user1", "user2", "user1thumb", "user2thumb"]
class MessageSerializer(serializers.ModelSerializer):
username = serializers.CharField(source='user.username')
thumb = serializers.CharField(source='user.accountimage.image.url')
class Meta:
model= Message
fields=['id','content', 'username', 'thumb']
class LobbySerializer(serializers.ModelSerializer):
class Meta:
model=Lobby
fields="__all__"
depth=2
и, наконец, мнения:
class ThreadView(viewsets.ModelViewSet):
queryset = Thread.objects.all()
serializer_class = ThreadSerializer
def get_queryset(self):
print(self.request.user)
return Thread.objects.filter(Q(user1= self.request.user) | Q(user2=self.request.user))
class MessageView(viewsets.ModelViewSet):
queryset = Message.objects.all()
serializer_class = MessageSerializer
filter_fields=('lobby__title',)
class LobbyView(viewsets.ModelViewSet):
queryset = Lobby.objects.all()
serializer_class = LobbySerializer
в моемsettings.py Я включил Аутентификацию глобально:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':[
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication'
],
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}