Python Django多级联接查询

时间:2018-12-03 20:23:15

标签: django django-rest-framework django-views django-queryset django-serializer

任务详细信息 我正在基于提供的键信息创建一个自定义API来从三个表中获取数据。

背景 详细来说,我有三个数据表-Client,Account和Client_accounts,它们的结构如下所示:

Client
    ID           (Integer)       Primary Key
    display_name (varchar)

Accounts
    ID           (Integer)       Primary Key
    nickname     (varchar)   

Client_Accounts
    Client_ID    (Integer)       Foreign Key -> ID from client table   
    Account_ID   (Integer)       Foreign Key -> ID from accounts table

打算将客户ID传递给我的API,并希望获取该客户拥有的所有帐户(和帐户名称)。

我要复制的SQL查询看起来像这样:

select
    cl.id as client_id,
    cl.display_name,
    ac.id as account_id,
    ac.nickname as account_name
from
    datahub_clients         cl
    join
    datahub_client_accounts cl_ac
    on 
        cl.id=cl_ac.client_id
    join    
    datahub_accounts        ac
    on 
        cl_ac.account_id=ac.id
where
    cl.id=15
;

到目前为止完成 这就是我用来获取客户帐户的方法:

##### For endpoint - get_client_name
@api_view(['GET', 'POST'])
@permission_classes((AllowAny,))
def get_client_name(request):
    try:
        if request.method == 'GET':   
            list_of_account_ids = Client_Accounts.objects.filter(client_id=request.GET['id']).values_list('account')
            needed_accounts = Accounts.objects.filter(id__in=list_of_account_ids).values('id','nickname')

            return Response({'requested client id':request.GET['id'],'identified client name': 'detailed info to go here'}, status=status.HTTP_200_OK)

        else:
          return Response({'status':'error','message': 'Facepalm moment!'}, status=status.HTTP_403_FORBIDDEN)

问题陈述

1)在上面的代码中,我能够提取client_id的相关帐户,但是,我只能从帐户表中打印详细信息。如何将客户端信息也放置在输出中(client_id,昵称-如SQL查询所示)

2)SQL'old_field_name AS some_new_name'的django替换是什么?在上面显示的数据表中,客户表和客户表均具有“ ID”列。我想将它们放在同一JSON输出中,并且为了能够区分它们,我想重命名它们。

3)至此,我的查询集具有来自多个模型的字段成员。如何序列化它们?我知道我需要编写一个基于两个模型的自定义序列化器(对于上面的示例)。我对在model =部分和meta:部分中指定的内容感到困惑。

0 个答案:

没有答案