python - were - ungültiges Literal für int() mit der Basis zehn in der ListeAPI-Ansicht django rest framework



django rest framework tutorial (1)

Update - Meine ursprüngliche Antwort war falsch. Die lookup_field funktioniert nicht mit den Attributen lookup_field und lookup_url_kwarg Attribute werden von Rest Frameworks DetailView in der Methode get_object(self) verwendet, um eine einzelne Instanz mit diesen Nachschlagefeldern abzurufen.

Ich habe die Antwort so aktualisiert, dass sie die get_queryset(self) -Methode überschreibt, um die korrekt gefilterte Liste zurückzugeben. So sollte ListView angepasst werden.

Offenbar haben Sie Ihren ListView nicht richtig definiert. Das Problem scheint zu sein, dass Sie versuchen, den primären Cities-Schlüssel zu filtern, bei dem es sich um ein Integer-Feld handelt, das eine Zeichenfolge verwendet, die nicht als ganze Zahl analysiert werden kann. Ich werde aufschreiben, wie Ihre Ansicht aussehen sollte, wenn Sie versuchen, Ihre Filterung basierend auf einem Feld des Stadtmodells durchzuführen.

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

Dadurch werden Ihre Nachbarschaften nach dem Namen der Städte gefiltert. Wenn Sie Nachbarschaften nach dem primären Schlüssel der Stadt filtern möchten, sollten Sie Folgendes verwenden:

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

Dadurch werden die Ansicht und die URLs so angepasst, dass Nachbarschaften nach dem Primärschlüssel der Städte gefiltert werden. Dies wäre leistungsfähiger, da keine Verbindung zwischen Stadt und Nachbarschaft durchgeführt werden muss.

Ich verwende eine Ansicht im Django-Rest-Framework. In dieser Ansicht braucht es eine Argument- city um dann eine Liste von Vierteln in dieser Stadt zu holen.

Das Beispiel der URL sieht so aus:

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

Der URL-Code sieht folgendermaßen aus:

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

die Aussicht:

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)

der Serializer:

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

das Model:

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

was ich nicht verstehe ist, dass ich das Nachschlagefeld auf city setze, es sei denn, das funktioniert nur für Instanzen, nicht für Listen? Und listAPIView ich den generischen listAPIView

Der Ausnahmeort ist hier:

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

und der Code in Zeile 966 ist der folgende:

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

Der Rückgabewert dieser Methode im init- Ordner, auf den der Stack-Trace verweist, wird jedes Mal als int übergeben. Also ich denke jetzt ist die Frage, wie wir diesen Unsinn außer Kraft setzen oder umgehen.

Jetzt arbeite ich mich zurück und versuche herauszufinden, was vor sich geht.

Hat jemand irgendwelche Ideen?





django-rest-framework