DRF - 在过滤器中,使用字段值而不是默认的 pk / id
DRF - in filter, use field-value instead of default pk / id
我正在尝试使用 DRF 的过滤器,以便 URL 查询如下所示:
/roadname/?road=M5
不像这样
/roadinfo/?road=1
当我有一个 ForeignKey 关系时,我似乎无法做到这一点。
我试过使用 lookup_field,但没有成功(尽管我不确定这对多个筛选字段有何作用 - 我认为这不是答案)。我试过在视图中使用 get_queryset() 方法,如 documentation 中的第二个示例。我遇到的一条评论表明这是不好的 RESTApi 做法 - 是吗?用户如何知道在前端客户端中输入“1”以获得 'M5' 的结果?
我已经设置了两个非常简单的模型(以及序列化程序、视图等)来尝试如下所示。
如果我使用 RoadName,我必须在过滤器搜索框中输入名称(而不是使用下拉列表),但 url 查询正是我想要的。
如果我使用 RoadInfo(它有一个 ForeignField 到 RoadName),我会在筛选框中得到一个下拉列表,但是 url 查询使用 ForeignKey pk。
我的问题:如何设置,以便在我使用 RoadInfo 时,查询使用字段值而不是 id/pk?
型号
from django.db import models
class RoadName(models.Model):
road = models.CharField(max_length=50)
def __str__(self):
return str(self.road)
class RoadInfo(models.Model):
road = models.ForeignKey(RoadName, on_delete='CASCADE')
# other data
def __str__(self):
return str(self.road)
序列化程序
from traffic.models import *
from rest_framework import serializers
class RoadNameSerializer(serializers.ModelSerializer):
road = serializers.CharField()
class Meta:
model = RoadName
exclude = ('id',)
class RoadInfoSerializer(serializers.ModelSerializer):
road = RoadNameSerializer()
class Meta:
model = RoadInfo
exclude = ('id',)
观看次数
from traffic.serializers import *
from traffic.models import *
from django_filters import rest_framework as filters
from rest_framework import viewsets
class RoadNameViewSet(viewsets.ReadOnlyModelViewSet):
""" List of all traffic count Counts """
queryset = RoadName.objects.all()
serializer_class = RoadNameSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = '__all__'
class RoadInfoViewSet(viewsets.ReadOnlyModelViewSet):
""" List of all traffic count Counts """
queryset = RoadInfo.objects.all()
serializer_class = RoadInfoSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = '__all__'
RoadName
模型的 road
属性上的数据 M5。可以通过road__road
从RoadInfo
模型过滤。
所以,尝试 /roadname/?road__road=M5
我正在尝试使用 DRF 的过滤器,以便 URL 查询如下所示:
/roadname/?road=M5
不像这样
/roadinfo/?road=1
当我有一个 ForeignKey 关系时,我似乎无法做到这一点。
我试过使用 lookup_field,但没有成功(尽管我不确定这对多个筛选字段有何作用 - 我认为这不是答案)。我试过在视图中使用 get_queryset() 方法,如 documentation 中的第二个示例。我遇到的一条评论表明这是不好的 RESTApi 做法 - 是吗?用户如何知道在前端客户端中输入“1”以获得 'M5' 的结果?
我已经设置了两个非常简单的模型(以及序列化程序、视图等)来尝试如下所示。
如果我使用 RoadName,我必须在过滤器搜索框中输入名称(而不是使用下拉列表),但 url 查询正是我想要的。
如果我使用 RoadInfo(它有一个 ForeignField 到 RoadName),我会在筛选框中得到一个下拉列表,但是 url 查询使用 ForeignKey pk。
我的问题:如何设置,以便在我使用 RoadInfo 时,查询使用字段值而不是 id/pk?
型号
from django.db import models
class RoadName(models.Model):
road = models.CharField(max_length=50)
def __str__(self):
return str(self.road)
class RoadInfo(models.Model):
road = models.ForeignKey(RoadName, on_delete='CASCADE')
# other data
def __str__(self):
return str(self.road)
序列化程序
from traffic.models import *
from rest_framework import serializers
class RoadNameSerializer(serializers.ModelSerializer):
road = serializers.CharField()
class Meta:
model = RoadName
exclude = ('id',)
class RoadInfoSerializer(serializers.ModelSerializer):
road = RoadNameSerializer()
class Meta:
model = RoadInfo
exclude = ('id',)
观看次数
from traffic.serializers import *
from traffic.models import *
from django_filters import rest_framework as filters
from rest_framework import viewsets
class RoadNameViewSet(viewsets.ReadOnlyModelViewSet):
""" List of all traffic count Counts """
queryset = RoadName.objects.all()
serializer_class = RoadNameSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = '__all__'
class RoadInfoViewSet(viewsets.ReadOnlyModelViewSet):
""" List of all traffic count Counts """
queryset = RoadInfo.objects.all()
serializer_class = RoadInfoSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = '__all__'
RoadName
模型的 road
属性上的数据 M5。可以通过road__road
从RoadInfo
模型过滤。
所以,尝试 /roadname/?road__road=M5