Фильтрация ресурсов 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
Вернуться на верх