Serializing где делает дополнительный запрос в бд?
мои model
class Chat(models.Model):
client = models.BigIntegerField(verbose_name='ID клиента')
operator = models.BigIntegerField(verbose_name='ID оператора')
data = models.DateTimeField(auto_now_add=True)
works = models.BooleanField(default=True)
stopped = models.BooleanField(default=False)
ticket = models.ForeignKey(Ticket, related_name='chat', on_delete=models.CASCADE, verbose_name='№ Тикета')
def __str__(self):
return '№' + str(self.id)
class Message(models.Model):
user_id = models.BigIntegerField(verbose_name='ID отправителя')
text = models.CharField(max_length=1000, verbose_name='Текст сообщения')
chat = models.ForeignKey(Chat, related_name='message', on_delete=models.CASCADE)
read = models.BooleanField(default=True)
data = models.DateTimeField(auto_now_add=True, verbose_name='Время создания', editable=True)
def __str__(self):
return str(self.user_id)
мой serializers
class ChatSerializers(serializers.ModelSerializer):
ticket = serializers.CharField()
class Meta:
model = Chat
fields = ['client', 'operator', 'id', 'works', 'stopped', 'ticket', 'message']
read_only_fields = ['message']
depth = 1
def create(self, validated_data):
ticket_number = validated_data.pop('ticket')
ticket = Ticket.objects.get(number=ticket_number)
chat = Chat.objects.create(ticket=ticket, **validated_data)
return chat
def update(self, instance, validated_data):
if 'works' in validated_data:
instance.works = validated_data['works']
if validated_data['works'] is False:
instance.stopped = False
for message in self.data['message']:
update_messages = Message.objects.filter(id=message['id']).update(read=True)
instance.save()
return instance
elif validated_data.get('stopped', None) is False:
instance.stopped = False
for message in self.data['message']:
update_messages = Message.objects.filter(id=message['id']).update(read=True)
instance.save()
return instance
chat = super().update(instance, validated_data)
return instance
мой ViewSet
class ChatViewSet(ModelViewSet):
queryset = Chat.objects.prefetch_related(Prefetch('message', queryset=Message.objects.filter(read=False)))
serializer_class = ChatSerializers
filter_backends = [DjangoFilterBackend]
filterset_fields = ['works', 'stopped']
явно указал какие данные нужно загружать и использовать
queryset = Chat.objects.prefetch_related(Prefetch('message', queryset=Message.objects.filter(read=False)))
когда делаю GET запрос. получаю ожидаемый результат
{
"client": 11111111,
"operator": 2222222,
"id": 123,
"works": true,
"stopped": false,
"ticket": "4",
"message": [
{
"id": 5,
"user_id": 11111111,
"text": "Thh",
"read": false,
"data": "2022-07-06T19:18:35.132298+03:00",
"chat": 123
},
{
"id": 6,
"user_id": 11111111,
"text": "Gh",
"read": false,
"data": "2022-07-06T19:18:36.443032+03:00",
"chat": 123
}
]
}
когда делаю PATCH {"works": false}
или {"stopped": false}
запрос. получаю ожидаемый результат
{
"client": 11111111,
"operator": 2222222,
"id": 123,
"works": false,
"stopped": false,
"ticket": "4",
"message": [
{
"id": 5,
"user_id": 2222222,
"text": "Thh",
"read": false,
"data": "2022-07-06T19:18:35.132298+03:00",
"chat": 123
},
{
"id": 6,
"user_id": 2222222,
"text": "Gh",
"read": false,
"data": "2022-07-06T19:18:36.443032+03:00",
"chat": 123
}
]
}
Но когда я выполняю PATCH {"works": true}
или {"stopped": true}
он отправляет мне все связанные отношения message
{
"client": 11111111,
"operator": 2222222,
"id": 123,
"works": true,
"stopped": false,
"ticket": "4",
"message": [
{
"id": 5,
"user_id": 11111111,
"text": "Thh",
"read": true,
"data": "2022-07-06T19:18:35.132298+03:00",
"chat": 123
},
{
"id": 6,
"user_id": 11111111,
"text": "Gh",
"read": true,
"data": "2022-07-06T19:18:36.443032+03:00",
"chat": 123
},
{
"id": 7,
"user_id": 11111111,
"text": "Vh",
"read": true,
"data": "2022-07-06T19:18:39.429679+03:00",
"chat": 123
},
{
"id": 8,
"user_id": 11111111,
"text": "G",
"read": true,
"data": "2022-07-06T19:18:40.792661+03:00",
"chat": 123
},
{
"id": 9,
"user_id": 11111111,
"text": "ewrwer",
"read": true,
"data": "2022-07-06T19:19:39.343431+03:00",
"chat": 123
}
В чем причина такого поведения? буду раз любой подсказке!