Чтобы включить фильтрацию по полю deleted_at
моделей Destinantion
и Trip
, достаточно установить use_for_related_fields = True
для класса SoftDeleteManager
. Согласно ответу Каспара, это не возвращает удаленное Destinations
для trip_object.destinations.all()
.
Однако из ваших комментариев мы видим, что вы хотели бы отфильтровать Destinations
, которые связаны с Trip
через объект TripDestination
с установленным полем deleted_at
, то есть мягкое удаление на через экземпляр.
Давайте выясним, как работают менеджеры. Связанные менеджеры - это менеджеры удаленной модели, а не сквозной модели.
trip_object.destinantions.some_method()
звонки по умолчанию Destination
менеджер.
destinantion_object.trip_set.some_method()
звонки по умолчанию Trip
менеджер.
TripDestination
менеджер не вызывается в любое время.
Вы можете позвонить по номеру trip_object.destinantions.through.objects.some_method()
, если вы действительно этого хотите. Теперь я хотел бы добавить метод Instance Trip.get_destinations
и аналогичный Destination.get_trips
, который отфильтровывает удаленные соединения.
Если вы настаиваете на использовании менеджера для фильтрации, он становится более сложным:
class DestinationManager(models.Manager):
use_for_related_fields = True
def get_query_set(self):
query_set = super(DestinationManager, self).get_query_set()
if hasattr(self, "through"):
through_objects = self.through.objects.filter(
destination_id=query_set.filter(**self.core_filters).get().id,
trip_id=self._fk_val,
deleted_at__isnull=True)
query_set = query_set.filter(
id__in=through_objects.values("destination_id"))
return query_set.filter(deleted_at__isnull = True)
То же самое должно быть сделано для TripManager
, поскольку они будут отличаться. Вы можете проверить производительность и посмотреть django/db/models/fields/related.py
для справки.
Изменение метода get_queryset
диспетчера по умолчанию может затруднить возможность резервного копирования базы данных, а документация препятствует этому. Написание метода Trip.get_destinations
является альтернативой.