2017-12-06 2 views
0

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)?

Antwort

1

Versuch dies zu tun:

employee_list = Employee.objects.filter(company = auth_employee.employee.company.id).values("id", "username").order_by('id') 
+0

seine immer noch das gleiche Problem: ‚dict‘ Objekt hat kein Attribut ‚as_dict‘ – Axil

+0

wenn ich es ohne Lambda führen Sie es funktioniert. https://gist.github.com/axilaris/a27b0519f6df5eff148cd4feb2473ff4. Irgendwelche Ideen wie man as_dict() benutzt? – Axil

+0

Aktualisierte die Antwort. – rajkris

Verwandte Themen