python - instalar - pip3 install rest_framework
literal inválido para int() con base diez en lista vista de API django rest framework (1)
Estoy usando una vista en el marco de descanso django. En esta vista, se necesita una city
argumento para luego obtener una lista de barrios en esa ciudad.
el ejemplo de la url se ve así:
http://127.0.0.1:8000/api/neighborhood-list/chicago/
el código de la url se ve así:
url(r''neighborhood-list/(?P<city>[a-zA-Z]+)/'', VenueFilterOptionsView.as_view()),
la vista:
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)
el serializador:
class NeighborhoodSerializer(serializers.ModelSerializer):
class Meta:
model = Neighborhood
fields = ''neighborhood''
el modelo:
class Neighborhood(models.Model):
city = models.ForeignKey(City, null=True)
neighborhood = models.CharField(max_length=150, null=False)
Lo que no entiendo es que establecí el campo de búsqueda en city, a menos que eso solo funcione para instancias no listas. Y aun así estoy usando la listAPIView
genérica
la ubicación de la excepción está aquí:
/home/rickus/211hospitality/suitsandtables/backend/venv/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py in get_prep_value, line 966
y el código en la línea 966 es el siguiente:
def get_prep_value(self, value):
value = super(AutoField, self).get_prep_value(value)
if value is None:
return None
return int(value)
el valor de retorno de este método en la carpeta init a la que hace referencia la traza de la pila se está convirtiendo como int cada vez. Entonces, supongo que ahora la pregunta es ¿cómo anulamos esta tontería o trabajamos en torno a ella?
así que ahora estoy trabajando en mi camino de regreso tratando de descubrir qué está pasando.
¿Alguien tiene alguna idea?
Actualización: mi respuesta original fue incorrecta. La vista de lista en realidad no funciona con los lookup_field
y lookup_url_kwarg
, esos atributos son utilizados por Rest Frameworks DetailView en el get_object(self)
para recuperar una única instancia usando esos campos de búsqueda.
He actualizado la respuesta para que anule el get_queryset(self)
para devolver la lista filtrada correctamente. Así es como debe personalizarse ListView.
Parece que no ha definido su ListView correctamente. El problema parece ser que está intentando filtrar la clave principal de Cities, que es un campo entero, utilizando una cadena que no se puede analizar como un entero. Escribiré cómo creo que debería parecer su punto de vista suponiendo que intenta filtrar según algún campo del modelo de la ciudad.
# 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'',
)
]
Esto filtrará sus Vecindarios por el nombre de las Ciudades. Si desea filtrar Barrios por la Clave principal de la ciudad, debe usar:
# 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'',
)
]
Esto corrige la vista y las URL para filtrar Barrios por la Clave principal de Ciudades. Esto sería más eficaz porque no es necesario realizar una unión entre la ciudad y el barrio.