[英]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.