我正在尝试使用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__'
road
模型的RoadName
属性上的数据M5。它可以通过road__road
来自RoadInfo
模型进行过滤。
所以,试试/roadname/?road__road=M5