2017-12-06 13 views
0

Django Rest API에서 쿼리 목록을 작성하고 필요한 필드를 기반으로 json 응답을 반환하는 데 문제가 있습니다 (예 : 그냥 id, username 대신 username). 한 가지 방법은 람다로 시도했지만 작동하지 않았습니다. Django API list with pagination - Page is not JSON serializableDjango Rest API에서 필요한 필드 만있는 모델의 json 목록을 반환합니다 - lambda가 작동하지 않습니다.

내가 특정 필드의 모델 기록을 나열하려는 API 쿼리가 있습니다

이의 연속이다. 예를 들어 모델의 모든 필드 대신 (id 및 username 만). 모델에서 정의 된 도우미 함수 .as_dict()에 따라 json 필드를 생성하기 위해 lambda를 사용하려고합니다. 그러나 아래의 추적에 오류가 표시됩니다. https://gist.github.com/axilaris/ee40b0936d7d5591275d593acdcdd62a

AttributeError: 'dict' object has no attribute 'as_dict' 

를 빼고 : 이것은 역 추적에서 오류가

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

입니다 : 여기

제 기능을 기반으로 나머지 API가 문제입니다 하단에있는 람다 부분을 볼 수있다 lambda, 결과는 다음과 같은 결과를 반환합니다. https://gist.github.com/axilaris/a92f7be8978212a9cbabbf10b9d120ea. 어쩌면 그것은 직원 키가 존재하지 않기 때문에 .as_dict()를 인식하지 못합니까? 나는 여기서 람다가 어떻게 작동하는지 익숙하지 않다.

model.py (JSON에 대한 as_dict와 직원 모델())

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 ""} 

질문 : 목록을 조회하고 바로 ID처럼 (I 필요한 필드를 기반으로 JSON 응답을 반환 할 수있는 방법 , 모든 사용자 이름 대신 사용자 이름)? 이 일을

답변

1

시도 :

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

는 여전히 같은 문제는 : 내가 그것을 작동 람다없이 실행하면 'DICT'개체가 어떤 속성 'as_dict' – Axil

+0

이 없습니다. https://gist.github.com/axilaris/a27b0519f6df5eff148cd4feb2473ff4. as_dict()를 사용하는 방법에 대한 아이디어가 있습니까? – Axil

+0

답변이 업데이트되었습니다. – rajkris