2022年2月25日 星期五

Django沒有 foreign key時,做join

最近的案子,會應用到Django沒有 foreign key時,做join的部份

找了很久,終於找到解決方法了

趕快來寫個筆記

假設models.py是

class Order(models.Model):

  order_no=models.CharField(max_length=50)

  ship_adr=models.CharField(max_length=50)

  product=models.CharField(max_length=50)

class Shipment(models.Model):

  dshipment_id=models.AutoField(primary_key=True)

s_order_no=models.CharField(max_length=50)


而實際上s_order_no對應到order_no

那要怎麼寫 left join呢?

首先要

from django.db.models import OuterRef, Subquery

假設我們要輸出的主要是Shipment

那我們會寫Shipment

a = Shipment.objects.annotate(

   希望多輸出的欄位名稱=Subquery(  Order.objects.filter(order_no=OuterRef('s_order_no')).values('希望多輸出的欄位名稱')[:1]),

  第二個希望多輸出的欄位名稱=Subquery(  Order.objects.filter(order_no=OuterRef('s_order_no')).values('第二個希望多輸出的欄位名稱')[:1]),

)

以這個例子,就會是

a = Shipment.objects.annotate(

   ship_adr=Subquery(  Order.objects.filter(order_no=OuterRef('s_order_no')).values('ship_adr')[:1]),

  product=Subquery(  Order.objects.filter(order_no=OuterRef('s_order_no')).values('product')[:1]),

)

這樣就可以處理了,一開始會看不懂,但是多看幾次就懂了。

2021年12月28日 星期二

讀經筆記

 太5:15 人點燈,也不放在斗底下,乃是放在燈臺上,就照亮所有在家裡的人。

這裡的斗,是量穀的器具。點著的燈放在斗底下,光就照不出來。國度子民既是點著的燈,就不該被與食物有關的斗遮蔽。關心食物叫人憂慮。(六25。)

我的心不就是如此嗎?曾幾何時,心裡擔心的都是食物,是生活的所需,是養老的本錢。帶來的,不過是越發的憂慮。唯一的解法,就是放在燈台上,照亮所有家裡的人。不隱藏自己的光,在那裏發光照耀,才是得拯救之路。


2021年12月26日 星期日

Docker 常用指令

 最近年底了,碰到很多要處理的案子,有些指令都會一直用到,趕快來寫個cheat sheet。


幫已經做好的image 貼上標籤

docker tag <你的image name >:<tag> <新的標籤>:<tag>

登入某個repo 

docker login <repo url>

把image 推出去

docker push <repo  url/整個標籤>

2021年9月30日 星期四

Dockerfile 編輯某檔案教學

因為docker裡面,常常要加上我們公司的DNS位置,所以有了這篇筆記

如果是要直接加在檔案最後面的話

RUN echo "<要寫入的字串>" >> <要寫入檔案在容器中的絕對路徑,例如:/etc/System.conf>


假設今天是要找到某字串,並加在前面,就用sed 

RUN sed -i '<要搜尋與插入的字串,例如:/n=0/i sleep 1>' <要編寫檔案在容器中的絕對路徑,例如:/etc/unit.d/vsftpd >

這是很好用的,一定要學起來,真的!

2021年6月13日 星期日

VS code 開發必裝套件

 HTML :

即時顯示開發結果

Live server

Icon

幫助我們把code上色,以清楚辨識

Material Icon Theme

Monokai++

React: 

Simple React snippet 



開發方便:

Auto-Save on Window Change

2021年2月18日 星期四

Docker mysql cheat sheet

從備份檔還原資料庫

建資料庫
docker run --name <你想要的容器名> -p <TCP 可用的port:容器內的port,例如33060:3306> -e MYSQL_ROOT_PASSWORD=<你想要的密碼> -d mysql:latest

 把備份檔放進容器
docker cp <路徑/備份檔案名稱.sql> <容器ID>:/<容器內路徑>

進去容器
mysql -uroot -p
> CREATE DATABASE <DB Name>
> exit

mysql -uroot -p <DB Name> < <backup file name.sql>

即可

備份資料庫
進去docker
執行
mysqldump --all-databases --single-transaction --quick --lock-tables=false > full-backup-$(date +%F).sql -u root -p
出來到本機的cmd
docker cp <容器ID>:/<容器內路徑, e.g../home/data.sql>
<路徑/備份檔案名稱.sql eg, D:/backup.sql>

2020年12月28日 星期一

轉址怎麼設定

常常我們萬不得已需要轉址,讓某些處在網路限制區域的捧油,可以訪問我們的服務。

這個時候就相當麻煩,因為大多數的捧油,是把static資料夾,用collectstatic的方式,讓例如nginx或是apache來處理。這樣轉址只要另外設定轉址位置即可。

若是development環境,則是這樣設置:
假設我們轉址網址是
http://foo/bar/
STATIC_URL='/bar/static/'
MEDIA_URL='/bar/media/'
LOGIN_REDIRECT_URL='/bar/bar/'
LOGIN_URL='bar/login/'

然後記得URLs.py設定
path('bar/', include('mysite.urls'))
即可。