通过外键过滤 Tastypie 资源

Posted

技术标签:

【中文标题】通过外键过滤 Tastypie 资源【英文标题】:Tastypie resource filtering through foreign keys 【发布时间】:2021-10-23 16:04:15 【问题描述】:

我有一些通过外键连接的 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,
    )

我的 API 有一个 Tastypie (0.14.3) ModelResource 类,定义如下

class DensityResource(ModelResource):
    class Meta:
        queryset = Density.objects.filter(dive__drone_id=13).order_by('-measurement_time', 'depth')

正如我对单曲 dive__drone_id 所期望的那样。我想实现获取参数过滤,所以我可以做类似/?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']

排序工作正常,但过滤不正常。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

我找到了一个修改 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

【讨论】:

以上是关于通过外键过滤 Tastypie 资源的主要内容,如果未能解决你的问题,请参考以下文章

Django-Tastypie 过滤所有字段

Tastypie:具有复杂查询的高级过滤器

访问资源时 jQuery Ajax 失败 (Django Tastypie)

包含过滤条件的 Django-tastypie REST url

Django Tastypie 过滤器 OR 语句

Tastypie 的距离空间查询