【问题标题】:Django Rest Filterset - how to filter by nested serializer?Django Rest Filterset - 如何通过嵌套序列化程序进行过滤?
【发布时间】:2020-04-09 19:26:25
【问题描述】:

同事们晚上好!我有以下代码:

序列化器.py

class CoinCostsSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('price', 'timestamp',)
        model = CoinCosts

class CoinSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('symbol', 'crr', 'costs')
        model = Coins
    costs = CoinCostsSerializer(source='coincosts_set.all', many=True)

views.py

class CoinCostFilterSet(filters.FilterSet):

    class Meta:
        model = Coins
        fields = {
            'symbol': ['exact'],
        }


class CoinCostViewSet(viewsets.ModelViewSet):

    queryset = Coins.objects.all()
    serializer_class = CoinSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = CoinCostFilterSet

models.py

class Coins(models.Model):
    name = models.CharField(max_length=150)
    symbol = models.CharField(max_length=45)
    crr = models.CharField(max_length=3)

class CoinCosts(models.Model):
    coin_id = models.ForeignKey(Coins, on_delete=models.CASCADE)
    crr = models.CharField(max_length=3)
    volume = models.DecimalField(max_digits=19, decimal_places=4)
    reserve = models.DecimalField(max_digits=19, decimal_places=4)
    price = models.DecimalField(max_digits=19, decimal_places=4)
    timestamp = models.DateTimeField(auto_now_add=True, blank=True)

然后输入地址

/CoinCost/?symbol=ZERO

例如,我在这枚硬币上从 Django 过滤。

所以我需要这个网址:

/CoinCost/?symbol=ZERO&timestamp_start=2019-12-14T00:00:00&timestamp_end=2019-12-17T00:00:00 
  • 不仅可以按零币过滤,还可以按时间戳过滤。你能帮我吗?对于这个任务,我的代码应该是什么样的?如何也按嵌入式序列化程序进行过滤?

我看到了这个Filtered Nested Relationships Django Rest Framework 但是>没用,我在序列化程序中有 2 个嵌套字段 - 时间戳和成本

感谢您的帮助!周末愉快!

【问题讨论】:

  • 伊戈尔,也展示你的模型
  • 添加了models.py
  • Igor,通常,开发人员对表使用单数名称,例如 Coin 和 CoinCost
  • 是的,谢谢,我明天编辑)

标签: python django django-rest-framework


【解决方案1】:

Filtering across relationships 用于 Django 1.112.x

import rest_framework_filters as filters
from rest_framework_filters import IsoDateTimeFilter


class CoinFilterSet(filters.FilterSet):

    class Meta:
        model = Coins
        fields = {
            'symbol': ('exact', 'in', 'startswith', 'endswith', 'contains')}


class CoinCostFilterSet(filters.FilterSet):
    coin = filters.RelatedFilter(
        CoinFilterSet, queryset=Coins.objects.all())

    class Meta:
        model = CoinCosts
        fields = {
            'timestamp': ('exact', 'in', 'gt', 'gte', 'lt', 'lte')}
        filter_overrides = {
            DateTimeField: {'filter_class': IsoDateTimeFilter}}

对此类查询使用这些过滤器

/CoinCost/?coin__symbol=ZERO&timestamp__gte=2019-12-14T00:00:00&timestamp__lte=2019-12-17T00:00:00

【讨论】:

  • 好!但是我使用 Django 3,并且您的模块不支持此版本。更多错误 ImportError: cannot import name 'six' and I see this module work i only Django
  • Igor,你可以使用这个 Python 包到 Django 2.2
  • 伊戈尔,现在就使用 Django 2,它对你的情况没有好处,只有问题
猜你喜欢
  • 2020-03-21
  • 2016-05-14
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2021-06-21
  • 2015-05-11
  • 2019-01-16
  • 1970-01-01
相关资源
最近更新 更多