簡體   English   中英

Django 過濾掉相關字段

[英]Django filter out on related field

我有三個模型,其中兩個通過外鍵鏈接到第三個,如下:

class A(models.Model):
    sku = models.ForeignKey("SKU", on_delete=models.PROTECT)
    production_start = models.DateField(blank=True, null=True)
    production_end = models.DateField(blank=True, null=True)

class B(models.Model):
    date = models.DateField()
    sku = models.ForeignKey("SKU", on_delete=models.PROTECT)
    quantity = models.PositiveIntegerField()
    last_modified = models.DateTimeField(auto_now=True)

class SKU(models.Model):
    product = models.CharField(max_length=64)
    design = models.CharField(max_length=64)

我想以一種有效的方式過濾可以在A響應中返回的外鍵,例如通過在端點參數上定義日期范圍過濾器(例如,/A/?from_date=2021-01-01&to_date=2021- 01-02),對於生產日期在該范圍內的A的所有元素,我希望它返回包含B元素的 object A,其date與特定日期匹配的同一SKU

例子:

"data"=[
    {
        "sku": 7,
        "production_start": "2021-01-01",
        "production_end": "2021-01-07",
        "b": [
            {
                "date": "2021-01-01",
                "quantity": 100
            },
            {
                "date": "2021-01-02",
                "quantity": 200
            }
        ]
    },
    ...
]

到目前為止,我已經嘗試將django-filters中的過濾器添加到我的views.py中。

class AViewSet(viewsets.ReadOnlyModelViewSet):
    class AFilterSet(django_filters.FilterSet):
        from_date = django_filters.DateFilter(field_name="sku__b__date", lookup_expr="gte")
        to_date = django_filters.DateFilter(field_name="sku__b__date", lookup_expr="lte")

        class Meta:
            model = models.A
            fields = []


    queryset = models.A.objects.all()
    serializer_class = serializers.ASerializer
    filterset_class = AFilterSet

還有我的serializers.py

class BSerializer(serializers.Serializer):
    date = serializers.DateField()
    quantity = serializers.IntegerField()


class ASerializer(serializers.ModelSerializer):
    b = BSerializer(many=True, source="sku.b_set")

    class Meta(ASerializer.Meta):
        fields = "__all__"

但是,這種方法仍然返回與 object A相關的每個 object B ,而不是過濾掉范圍過濾器之外的日期。

class Meta中添加可變depth ,如下所示, 參考

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']
        depth = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM