Фильтрация ресурсов Tastypie через внешние ключи
У меня есть несколько моделей Django (3.1), связанных через внешние ключи
class Drone(models.Model):
serial = models.CharField(max_length=200, null=False, unique=True)
class Dive(models.Model):
measurement_time = models.DateTimeField(db_index=True)
drone = models.ForeignKey(
Drone,
on_delete=models.PROTECT,
null=True,
)
class Density(models.Model):
measurement_time = models.DateTimeField(db_index=True)
depth = models.IntegerField()
density = models.FloatField(null=True)
dive = models.ForeignKey(
Dive,
on_delete=models.PROTECT,
db_index=True,
null=True,
)
У меня есть класс Tastypie (0.14.3) ModelResource для моего API, определенный как
class DensityResource(ModelResource):
class Meta:
queryset = Density.objects.filter(dive__drone_id=13).order_by('-measurement_time', 'depth')
, который работает так, как я ожидаю для единственного dive__drone_id
. Я хочу реализовать фильтрацию параметров get, чтобы я мог делать что-то вроде /?order_by=-measurement_time&order_by=depth&dive__drone_id=13
.
поэтому я переписал этот класс на
class DensityResource(ModelResource):
class Meta:
queryset = Density.objects.all()
filtering = {
'dive__drone_id': ALL
}
ordering = ['measurement_time', 'depth']
и упорядочивание работает нормально, но не фильтрация. Что я здесь упускаю?
Я нашел решение, модифицировав метод build_filters
вместо этого:
class DensityResource(ModelResource):
class Meta:
queryset = Density.objects.all()
ordering = ['measurement_time', 'depth']
def build_filters(self, filters=None, **kwargs):
orm_filters = super(DensityResource, self).build_filters(filters, **kwargs)
if 'dive__drone_id' in filters.keys():
orm_filters['dive__drone_id'] = filters['dive__drone_id']
return orm_filters