In meiner Django Rest API habe ich Probleme, eine Abfrage Liste zu tun und JSON Antwort auf die Felder, die ich benötige (wie Nur ID, Benutzername anstelle von allen im Modell). Ein Weg ist mit Lambda zu versuchen, aber es hat nicht funktioniert. Django Rest API, Rückgabe Json Liste eines Modells mit nur erforderlichen Feldern - Lambda hat nicht funktioniert
Dies ist eine Fortsetzung dafür: Django API list with pagination - Page is not JSON serializable
ich eine API-Abfrage, wo ich Modell Aufzeichnung bestimmter Felder aufgelistet werden sollen. Zum Beispiel (nur ID und Benutzername) anstelle aller Felder im Modell. Ich versuche, Lambda zu verwenden, um die JSON-Felder gemäß einer Hilfefunktion .As_dict() zu generieren, die in dem Modell definiert wird. Aber es verursacht einen Fehler, wie im folgenden Traceback gezeigt.
Hier ist meine Funktion basiert Rest API, am unteren Rand des Lambda-Teil sehen, dass das Problem ist:
@api_view(['POST'])
def employee_get_list_by_page(request):
# ----- YAML below for Swagger -----
"""
description: employee_get_list_by_page
parameters:
- name: token
type: string
required: true
location: form
- name: page
type: string
required: true
location: form
- name: page_limit
type: string
required: true
location: form
"""
token = request.POST['token']
try:
auth_employee = AuthEmployeeSessionToken.objects.get(token=token)
except AuthEmployeeSessionToken.DoesNotExist:
return Response("Invalid Token", status=status.HTTP_406_NOT_ACCEPTABLE)
employee_list = Employee.objects.filter(company = auth_employee.employee.company.id).order_by('id')
page = request.GET.get('page', request.POST['page'])
paginator = Paginator(employee_list, request.POST['page_limit'])
try:
employees = paginator.page(page)
except PageNotAnInteger:
employees = paginator.page(request.POST['page'])
except EmptyPage:
employees = paginator.page(paginator.num_pages)
# Here we map a lambda function over the queryset of Models to return the dictionary representation for each element in the list
employees_page = list(
map(lambda employee: employee.as_dict(), list(employees))
)
return Response(employees_page ,status=status.HTTP_200_OK)
Dies ist der Fehler aus dem Zurückverfolgungs: https://gist.github.com/axilaris/ee40b0936d7d5591275d593acdcdd62a
AttributeError: 'dict' object has no attribute 'as_dict'
ohne die Lambda, das Ergebnis gibt das Ergebnis zurück, das so aussieht. https://gist.github.com/axilaris/a92f7be8978212a9cbabbf10b9d120ea. Vielleicht erkennt es .as_dict() nicht, weil der Mitarbeiterschlüssel nicht existiert? Ich weiß nicht, wie Lambda hier funktioniert.
model.py (Employee Modell mit as_dict() für json)
class Employee(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee')
company = models.ForeignKey(Company)
username = models.CharField(max_length=30, blank=False)
email = models.CharField(max_length=30, blank=False)
first_name = models.CharField(max_length=30, blank=False)
last_name = models.CharField(max_length=30, blank=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.user.username
def as_dict(self):
return {"id": "%d" % self.id,
"username": self.username if self.username else ""}
Frage: Wie ich Liste abfragen tun können, und eine Json Antwort basierend auf den Feldern zurück, die ich (wie gerade id erfordern, Benutzername anstelle von allen)?
seine immer noch das gleiche Problem: ‚dict‘ Objekt hat kein Attribut ‚as_dict‘ – Axil
wenn ich es ohne Lambda führen Sie es funktioniert. https://gist.github.com/axilaris/a27b0519f6df5eff148cd4feb2473ff4. Irgendwelche Ideen wie man as_dict() benutzt? – Axil
Aktualisierte die Antwort. – rajkris