python slugrelatedfield 在listAPI视图django rest框架中int()与基数十的无效文字



slugrelatedfield (1)

我在Django rest框架中使用一个视图。 在这个视图中,它需要一个参数city ,然后获取该城市的邻居列表。

网址的例子如下所示:

http://127.0.0.1:8000/api/neighborhood-list/chicago/

url代码如下所示:

url(r'neighborhood-list/(?P<city>[a-zA-Z]+)/', VenueFilterOptionsView.as_view()),

风景:

class NeighborhoodListView(generics.ListAPIView):
lookup_field = 'city'

def list(self, request, city):
    self.city = city
    queryset = Neighborhood.objects.filter(city=self.city)
    serializer = NeighborhoodSerializer(queryset, many=True)

序列化器:

class NeighborhoodSerializer(serializers.ModelSerializer):
    class Meta:
        model = Neighborhood
        fields = 'neighborhood'

该模型:

class  Neighborhood(models.Model):
city = models.ForeignKey(City, null=True)
neighborhood = models.CharField(max_length=150, null=False)

我不明白的是我把查找字段设置为城市,除非只适用于不是列表的实例? 即使如此,我正在使用listAPIView通用

例外的位置在这里:

    /home/rickus/211hospitality/suitsandtables/backend/venv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py in get_prep_value, line 966

而第966行的代码如下:

def get_prep_value(self, value):
        value = super(AutoField, self).get_prep_value(value)
        if value is None:
            return None
        return int(value)

堆栈跟踪引用的init文件夹中的此方法的返回值每次都被转换为int。 所以我想现在的问题是我们如何重写这个废话或解决它。

所以现在我正在回头试图弄清楚发生了什么。

有人有主意吗?


更新 - 我原来的答案是不正确的。 列表视图实际上并不与lookup_fieldlookup_url_kwarg属性一起工作,这些属性由get_object(self)方法中的Rest Frameworks DetailView使用,以使用这些查找字段检索单个实例

我已经更新了答案,所以它覆盖了get_queryset(self)方法来返回正确的过滤列表。 这是如何定制ListView的。

看起来你没有正确定义你的ListView。 问题似乎是,您正在尝试使用不能被解析为整数的字符串来过滤城市主键,这是一个整数字段。 我会写出我认为你的观点应该看起来假设你试图根据城市模型的一些领域进行过滤。

# models.py
class City(models.Model):
    name = models.CharField(max_length=32)

class Neighbourhood(models.Model):
    city = models.ForeignKey(City)

# views.py
class NeighbourhoodListView(generics.ListAPIView):
    queryset = Neighbourhood.objects.all()
    serializer_class = NeighbourhoodSerializer

    def get_queryset(self):
        return self.queryset.filter(city__name=self.kwargs.get('city')

# urls.py
urlpatterns = [
    url(
        r'^neighbourhood-list/(?P<city>[a-zA-Z]+)/$',
        NeighbourhoodListView.as_view(),
        name='neighbourhood-list',
    )
]

这将按城市名称过滤您的邻居。 如果你想通过城市主键过滤社区,那么你应该使用:

# views.py
class NeighbourhoodListView(generics.ListAPIView):
    queryset = Neighbourhood.objects.all()
    serializer_class = NeighbourhoodSerializer

    def get_queryset(self):
        return self.queryset.filter(city=self.kwargs.get('city'))

# urls.py
urlpatterns = [
    url(
        r'^neighbourhood-list/(?P<city>\d+)/$',
        NeighbourhoodListView.as_view(),
        name='neighbourhood-list',
    )
]

这修复了视图和网址,通过城市主键过滤邻里。 这将是更高性能的,因为它不需要执行城市和邻居之间的连接。





django-rest-framework