Обновление Django ORM с помощью фильтра приводит к обновлению неожиданных полей
У меня есть очень простой DjangoRestFramework api_view, где я получаю id и фильтрую набор запросов по этому id и дате начала больше, чем сегодня.
Моя модель довольно проста, она имеет пациента (FK), is_cancelled (boolean), начало (Datetime) и конец (Datetime).
Проблема в том, что когда я запускаю нижеприведенное обновление, оно устанавливает дату начала на дату и время, когда я запускаю это представление.
@api_view(['POST'])
def BookingCancelAppointmentsView(request):
if request.method == 'POST':
patient_id = request.data
today = date.today()
bookings = Booking.objects.filter(patient=patient_id, start__gte=today).update(is_cancelled=True)
return Response({'message': 'Appointments cancelled'})
Например, если для данного идентификатора пациента найдена запись, которая больше, чем сегодня, он обновляет поле "is_cancelled" для правильной записи, но он устанавливает время начала с того времени, которое у меня было там изначально, на значение date.today(), хотя я обновляю только поле "is_cancelled".
Есть ли у кого-нибудь идеи, почему это вообще затрагивает поле "start" и как я могу обойти эту проблему?
Версии программного обеспечения:
- Python Версия: 3.10.5
- Django Версия: 3.2.15
- Django Rest Framework Версия: 3.13.1
Попробуйте проверить вашу модель Booking
. Это может быть связано с тем, что вы установили auto_now=True
на поле start
.
Ex.
class Booking(models.Model):
is_cancelled = models.BooleanField()
start = models.DateTimeField(auto_now=True)
Если auto_now=True
поле будет автоматически устанавливаться в значение now при каждом сохранении объекта
Если вам просто нужно установить поля времени во время создания объекта. Вы можете передать auto_now_add=True
, вместо auto_now=True
.
Передача auto_now
будет обновлять поле каждый раз, когда вызывается метод сохранения.
class Booking:
<...other fields here...>
start = models.DateTimeField(auto_now_add=True)
end = models.DateTimeField(auto_now_add=True)
В качестве альтернативы вы можете использовать массовые операции для сохранения данных в модели. При массовых операциях эти поля не будут обновляться. Хотя такой подход не рекомендуется, это просто хак, если вы не хотите изменять свои модели по каким-то причинам.