python - viewsets - littéral invalide pour int() avec base dix dans listAPI view django rest framework



serializermethodfield (1)

J'utilise une vue dans le cadre de repos django. Dans cette vue, il faut une city arguments pour aller chercher une liste de quartiers dans cette ville.

l'exemple de l'URL ressemble à ceci:

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

le code de l'URL ressemble à ceci:

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

la vue:

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)

le sérialiseur:

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

le modèle:

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

ce que je ne comprends pas, c'est que je mets le champ de recherche en ville, à moins que cela ne fonctionne que pour les instances et non les listes? Et même ainsi j'utilise le listAPIView générique

l'emplacement de l'exception est ici:

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

et le code sur la ligne 966 est le suivant:

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

La valeur de retour de cette méthode dans le dossier init référencé par la trace de la pile est convertie en int à chaque fois. Donc, je suppose que maintenant la question est de savoir comment nous pouvons contourner cette absurdité ou contourner le problème.

alors maintenant je travaille en arrière en essayant de comprendre ce qui se passe.

Quelqu'un at-il des idées?


Mise à jour - Ma réponse originale était incorrecte. La vue Liste ne fonctionne pas réellement avec les lookup_field et lookup_url_kwarg , ces attributs sont utilisés par Rest Frameworks DetailView dans la get_object(self) pour récupérer une instance unique en utilisant ces champs de recherche.

J'ai mis à jour la réponse afin qu'elle remplace la get_queryset(self) pour renvoyer la liste correctement filtrée. C'est ainsi que ListView devrait être personnalisé.

Il semble que vous n'ayez pas défini correctement votre ListView. Le problème semble être que vous essayez de filtrer sur la clé primaire Cities, qui est un champ entier, en utilisant une chaîne qui ne peut pas être analysée comme un entier. Je vais écrire comment je pense que votre vue devrait ressembler présumant votre essayant de faire votre filtrage basé sur un champ sur le modèle de la ville.

# 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',
    )
]

Cela va filtrer vos quartiers par le nom des villes. Si vous souhaitez filtrer les quartiers par la clé primaire des villes, vous devez utiliser:

# 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',
    )
]

Cela corrige la vue et l'URL pour filtrer les quartiers par la clé primaire des villes. Ce serait plus performant car il n'a pas besoin d'effectuer une jointure entre la ville et le voisinage.





django-rest-framework