From 166131d003684f068cf5c0fde14685e1779d87e4 Mon Sep 17 00:00:00 2001 From: jhj2075 Date: Sun, 16 Jun 2024 23:13:15 +0900 Subject: [PATCH] feat: week 4 assignment - Hyungjun --- .../bookapp/__init__.py" | 0 .../__pycache__/__init__.cpython-39.pyc" | Bin 0 -> 225 bytes .../bookapp/__pycache__/admin.cpython-39.pyc" | Bin 0 -> 339 bytes .../bookapp/__pycache__/apps.cpython-39.pyc" | Bin 0 -> 504 bytes .../__pycache__/models.cpython-39.pyc" | Bin 0 -> 742 bytes .../__pycache__/serializers.cpython-39.pyc" | Bin 0 -> 686 bytes .../bookapp/__pycache__/urls.cpython-39.pyc" | Bin 0 -> 1192 bytes .../bookapp/__pycache__/views.cpython-39.pyc" | Bin 0 -> 4508 bytes .../bookapp/admin.py" | 5 + .../bookapp/apps.py" | 6 + .../bookapp/migrations/0001_initial.py" | 25 +++ .../bookapp/migrations/__init__.py" | 0 .../__pycache__/0001_initial.cpython-39.pyc" | Bin 0 -> 882 bytes .../__pycache__/__init__.cpython-39.pyc" | Bin 0 -> 236 bytes .../bookapp/models.py" | 11 ++ .../bookapp/serializers.py" | 7 + .../bookapp/tests.py" | 3 + .../bookapp/urls.py" | 25 +++ .../bookapp/views.py" | 165 ++++++++++++++++++ .../bookproject/__init__.py" | 0 .../__pycache__/__init__.cpython-39.pyc" | Bin 0 -> 229 bytes .../__pycache__/settings.cpython-39.pyc" | Bin 0 -> 2436 bytes .../__pycache__/urls.cpython-39.pyc" | Bin 0 -> 1108 bytes .../__pycache__/wsgi.cpython-39.pyc" | Bin 0 -> 640 bytes .../bookproject/asgi.py" | 16 ++ .../bookproject/settings.py" | 128 ++++++++++++++ .../bookproject/urls.py" | 24 +++ .../bookproject/wsgi.py" | 16 ++ .../manage.py" | 22 +++ .../reviewapp/__init__.py" | 0 .../__pycache__/__init__.cpython-39.pyc" | Bin 0 -> 227 bytes .../__pycache__/admin.cpython-39.pyc" | Bin 0 -> 345 bytes .../__pycache__/apps.cpython-39.pyc" | Bin 0 -> 510 bytes .../__pycache__/models.cpython-39.pyc" | Bin 0 -> 858 bytes .../__pycache__/serializers.cpython-39.pyc" | Bin 0 -> 799 bytes .../reviewapp/admin.py" | 5 + .../reviewapp/apps.py" | 6 + .../reviewapp/migrations/0001_initial.py" | 27 +++ .../reviewapp/migrations/__init__.py" | 0 .../__pycache__/0001_initial.cpython-39.pyc" | Bin 0 -> 1040 bytes .../__pycache__/__init__.cpython-39.pyc" | Bin 0 -> 238 bytes .../reviewapp/models.py" | 13 ++ .../reviewapp/serializers.py" | 9 + .../reviewapp/tests.py" | 3 + .../reviewapp/views.py" | 3 + 45 files changed, 519 insertions(+) create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__init__.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/__init__.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/admin.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/apps.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/models.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/serializers.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/urls.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/views.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/admin.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/apps.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/0001_initial.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/__init__.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/__pycache__/0001_initial.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/__pycache__/__init__.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/models.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/serializers.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/tests.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/urls.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/views.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__init__.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/__init__.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/settings.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/urls.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/wsgi.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/asgi.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/settings.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/urls.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/wsgi.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/manage.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__init__.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/__init__.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/admin.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/apps.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/models.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/serializers.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/admin.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/apps.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/migrations/0001_initial.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/migrations/__init__.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/migrations/__pycache__/0001_initial.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/migrations/__pycache__/__init__.cpython-39.pyc" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/models.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/serializers.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/tests.py" create mode 100644 "4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/views.py" diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__init__.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__init__.py" new file mode 100644 index 00000000..e69de29b diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/__init__.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/__init__.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..0b85a0194fac2b3d6b54b4dde0b9525abfa59cad GIT binary patch literal 225 zcmYe~<>g`kf-gsc(m?cM5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;yrqkn3y}6Iz^F zR2-9*lWu8Y8RMUq>Qag`kg5(oHX*EFlF^GcP(&AaUkk22GZiK-CPIjJH@5Q*tx&fD9I={QPV`O|~e$l&r+O^nAVK{JfH) z%%mbFpu#A=B%o|!L4jUweoAUiaS_PYTP($yC8@VKic-@vi%U|ARx%W^0foWD*9IWV z*(xTqIJKxaCM_r3(!w&vKQGm#D6=e8L092T$J#gDOJ4Uhyq!Ap)z%3>k>LFNy!7JC z9EH$4ppqh>(Umc;*X(%HGAHKs%I-H!Yhn!b6kc!G_-6W)*OTWcylL6-rgcV4QmSro qYH@L9ex9yz4AhM=U@z$vRNmsS0XnxdC)JJ-=$c{{Ai=}P!wdiof@*#M literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/apps.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/apps.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..3af481ddad1dd4abee191eeedf1734a1d9171d3f GIT binary patch literal 504 zcmYjOze~eF6uxUxtUtPltB^HA1LC40qOIswLFp0>j?}w^Xqv0JR;Y`j6$Bjw6)QNp z2nsp~{sI0KS)DX-)7^J%#Xfl7z4yNF9`D{c`TPh1`+i$@J8-_MWYBa-7Qv+fz!1X$ zs$m;rw2D}UX>G(bj*m1u!}JYgW*iPsM=GP&1{^bG<0g5 z(s+bY5H|xAk5RhQbb>xJ&baF|g9de=1$DbUbj97HNNuAFKl>1s=14{IND?>jW@l!} zTF93pf0r8tBRzRcPw$emgRiTb&zEzkYzPs0(hrPE2$D$pjTT8BUeoq1N$yY6!v`{D z8OhUgdVQH(+!|^7H9hW-DlbSbr7yz5H0eKtz|*BwZ$%o+pngCq$YC9KD`iuQNBb*L c$|wVDm-!#R7mWfD=jMBRSWugnN;{_g0^u!^UjP6A literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/models.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/models.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..99a2a21290a6cc4838dd0183bb5a9a845352e7d4 GIT binary patch literal 742 zcmYjP&59F25bn-Ql9}v8eT3jGhXllnD3jzH&zBT%c5&CJ2 zWwOCo16F52FvPGxQ|x1mt|C@r)*La5<4Ns_FEDN89UZ zdgtUAlEUS!DZNJoPoivm8_Xu-BbtkB2p#?>qZ{4;Rt*pj&;&s$Jb;LL7H5KkVk<62 z2S~c$@aK_nzZh&QE>$oR(dvcO;AX-%WxT^Xy-xY;OS$){c>eJBoAgwWZcrQ^mGk|eIM^#69|q_8o#N}a^6l&5)qba(AC*tv1tIS#u2h^Rz4Ji` zZPD2*SUhKcwyT?js7w-KK2Fs@Abj65-S__igYGHq5R%X-Cq%ahf!JIa-6P~~PQ?O| zCRV!}V=Ax2Trk-L+i%c38>dpAUXP>eNya0-Kz%z_VWQnln(@lrKQqfi5f5nwg%SqG z+EgJpO)6Zwbce=*hJwo#$Xq?)k}%~Ota3m5g) cZuFPp!up2xHP0#gpissI20 literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/serializers.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/serializers.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..512be6bc00cd1f8deeb88730092dabc7c1a11a4e GIT binary patch literal 686 zcmZuuy=xRf6rZoVEXmzjm@3t_SKNZw7!e67SS2aWG|RxS$;^c{bGzrvMM)|#mk@}B zkcbK?Z2}Rr5K`vvnAR%UwY0JF&7PVI`ry5JANzj$-tQ&N<}?ENnLg>A!}|^NnlOkK zKy3s@B8fHX;}~P_6HWRwrWid&l1es0k}3R@?a;U;YhBc?UqBCPV>e@!NfVuJD`O#K z5Au9t&DSP{La+d8=fEfwV~Jt{$XF6UCOagik^(AoE#Ke$3;7Qc{)03-fuv~6B!*XKU{u&1DS4~ zXX`fA;YtRd7@H2acyW4Gj*fY8a!|fH<+q}+`23}OcT^l6hvn$3+&|k z=BvO>G8pg)%A>)SV}8LJ%wzpU1I(~#g0s|SrVg)}@+R=cr>}MxdkvrSjb1GQ6W}WL zOtp-%L(wz9){ES17+-d+-*ZG2JGP=KzOm@3y1HBi@xOn$;NF<>`~H^I$PL^ezW~{D Bv7Z0{ literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/urls.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/urls.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..96b65708e9d5066504002a2d29095077e1b21e36 GIT binary patch literal 1192 zcmb7D&ubGw6rN4errrMV2Y8=by3p)m^o03Dg`z1=*@#~CP@v7ptJ1kyf<&Z`QG>5_+w)xf^l?2YoD_S zeNsmM$b)eSUg5zMAQuHjkco^q<7N!C&PLfd=jIGVGC_{y)(2h>zCjN%U=4tkKeh(J z8alS}U=4Sydd@Y2p%r8e``a0W%+=*3TxGNt)|=dyA)~m)IIb{uJK=1dR3+|yZPUEj zAb73Gqr{hza4Obt6bgwsYf2(8APFoP-U!JZVdDjWi5Vw2q<|QAu#<@Rf?z>N$;2=k zQYND0I035)J6QK=o%N2Zve+TiId4xnk|kkPI4anIgt|Q?s+2pFcNCVJ*^zennN$z zJ@d=g7n+Xrwb4G}>e}n+`#o6AmAq9!xbSLGefq+*cY~679&Qj^#O+7#+PiOCkMDnb z{_5+;C*WCOjMhaM;Z+JDT!eDdYaJZ6clNy2{%(8wz=K|Ez5mdD@vQZ954U#?+YeuQ u6;c#L2)NP3b6%yBtfz`;C!6WeOw592L}m>jBgSFMog6hrv*U(-e*6T!#fW?W literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/views.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/__pycache__/views.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..bda956629d20eb77f3ce409550ab07920c6a711f GIT binary patch literal 4508 zcmbtX+mBmE89#IG_Ika}?xsm-0hdd_K$dMAp|(^g>2BI0RZhuns5r7X^6ohac8@Qa zIh&G|SBl6YMT7_>%1!FSMoNno1t~mKR08pboL8Q}?gI~fhTk{i%dyu^Q?NC2X6DS9 zneX>qe&1B*=d&99{@uLtqm!EU57|joCfesv#C=qO7O+TbFpn{6>yh3tJVUmP$ZS}i zCEI3XHyqEAZ7Xsc880K-c9d<*d2_PuM7hSiH!s_6ly59}3ru@e3o=1=UkkF~+%3Z^ zpg$Mn(9g;KG4$tyJoauT`Vk zZpbm>UJ6CK)f6GMtL>V9y%xTG$P!z`)p$o>)H(mgcfXH8H0?_vy+&)97E-;@a@(|9 z`lq9F4n;hLD%3m{Xr3OhK;PFqBQOFJPcyJ^Qaj1fim%s1OnYt9mxCYSPGt>66j8-m zogL`+v^_mGI&!_c`koP+9iwjDVjJ3_QQpKE%|^9(qhxbhD{)#|^>8~DiBXLrZeWPh znu!@y<7&xFOc6#`5{HM^c0v(*))r19lB^hFb*S-WeDLv2RBJC*F5``;T#2r}@cavv zi_LJI*RF@fGsWKRKlSe1@BaMeN5B64zdraSMmAcl=2cOPikF+1!bL5 ziE%ZIb2x~wQE4p8a%{Jd25&ms|xW4J2+&_}5`v0RXK+T8Xh8a^B*CJ2YeY zwav{p{Ijd8{>$gr{Yw|VclpA`X35~kXuU8H`#XhXD``+J*y@!AA{o!V@`^Ue2^qbqgpMB81bGv)z{)*CbMtTy@;|mF1 zl3Q)-PY&^k2Dnxx79ykwYt`>Mvrg#3b{crggc?XD~&O zt!qqYi!9Gh>Mq+|n!r%n`%E0$`1=3D5x(LE7Qzg$JjlRTw(!jMeWj1C#CeWzmR@3) z`4_M+C(Gbpri#3UpFma0O+d*{(9+0EYS7X~3kNSo+2drZpI0_n=qzjV-B%BPbG-*Q9{iBIC|;8rw!0`w;`3LlK`MN-WYz6~j(tMOt$hC|*Kmx6lt1 zGN`|a5YP`3-+FYIAY)b9aUR1eOS)13*;)z|8Khm1j!(|~ZIYD^M}}B{&+a~XR2p(w zIeW|u$w$Z(r5O_P9qmBt==a#30eV-oZ-VwsN+aNp7QD_kJyh@~)R#5Ph8X+$eDX$tvBQ#g;8eUY+?Z>1@XD`;vI8cOpTmPoO#0m%^6AsG@E z;$40g5+c4pE+mz)Me<4xrj{K$a3y2N!Dd-T5)iRGyCmX_l9NP~An;M#phKwOK_o2W zOKCC?E7|38nMtRmu;{67uP<}FS zD%-U=jm>r{di%-L8@QlgJIH{7v&r$%k!KMxA?Bh;L%fd0FdnL;=~EE#ZUG8(1{B`+ zOcw;+PI;zvl)xWBBRi6}-+$2k%fmH+f1!Cp;9pfHoH)b6Z$&3~2aCf9NP$Mhjz|Ugd zC%X4Dn3ULR%b6bjLrjuJ2Lq=RvefYL7GjW%0wbz$-rfI z>;oH4|4IkRb;p8hlheEC$vcc}W#Vjoj#9dQN@4X=3d$k)H>r|-pHnChBaE`MR4jOO z7;q+oA)&>eqe{ktX%UflF+k~O8#$KODbpB+gc;aT&XLwQCA&lHis+=VLxRO*7J*w{ z9pRp`h>~7bB3nviNzJr^N}Ilp*3qywl4l~U(bv~d(prCNy4DA2f-{*WNc($?T!GS& zOSBio6yyqXu8nMgM$4sTFTVxW#0_r+ca<;_l83#e!Qki;Dr8dVo#42m`d2uvIB&Q3 zTPx_wJG`Vg@6^QGAlz>8YD_mU0zAo&zgIc?^7!D2B2PN3S5S_VIvxcJ@AzmqeLzXI pbaUcGswg;1F;mIHFoR0mm(=C#I}FnV!I%TPr2a-BUwFE3^1ngViJSlc literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/admin.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/admin.py" new file mode 100644 index 00000000..81ab9d03 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/admin.py" @@ -0,0 +1,5 @@ +from django.contrib import admin +from bookapp.models import Book + +# Register your models here. +admin.site.register(Book) \ No newline at end of file diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/apps.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/apps.py" new file mode 100644 index 00000000..0f03ee31 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/apps.py" @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class BookappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'bookapp' diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/0001_initial.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/0001_initial.py" new file mode 100644 index 00000000..d51ccfc5 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/0001_initial.py" @@ -0,0 +1,25 @@ +# Generated by Django 4.2.13 on 2024-05-26 05:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Book', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('author', models.CharField(max_length=200)), + ('isbn', models.BigIntegerField()), + ('publication_date', models.DateField()), + ('available', models.BooleanField(default=True)), + ], + ), + ] diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/__init__.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/__init__.py" new file mode 100644 index 00000000..e69de29b diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/__pycache__/0001_initial.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/migrations/__pycache__/0001_initial.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..834531a74878fbed847808a8a071dea5b471f1e4 GIT binary patch literal 882 zcmY*X&1(}u6rY{ld~C95D|qr06oedFTD({hscotB&M;xSTq^6UnjKUl~)k6ZrH8^o8H(WCyt_8VPK1~6IR*@TcEuQ1~9ji%s0d+Pn za(l->sq~*zhQjO88-jWVxpKx;(8Iw9W2t|T=i@sxFx(2Cz=BU{d*xrHH?=h%MVp!m zzNG2$V$ISH>n4%kh=C=*b-5FZHjDfICiJzfAQnuDJD{B&#PvvlAF?*+Tp|()hhMO% znt?#D+rES_NH%mHqisa7wuGvOdZN>nkae_@ z&LuWejWaKTtJv#OnnT+Q8!R5N<7ik86A0i)VJ~8-Bb$S8NnqhfDn%VQ8u=cH&tlY! z{CtAk!X2D2Auz3U+?#-az+$?EXoyW#fR!K1t1pTGL{@iA)Fq9_cMkk$1N zU1BAYzBkxE7;f!)gT3wHy?t+HsycZ8Vffg`kf-gsc(m?cM5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;yrWkn3y}6Iz^F zR2-9*lWu8Y8RMUq>QaSrKk006C; BPw@Z% literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/models.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/models.py" new file mode 100644 index 00000000..39407489 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/models.py" @@ -0,0 +1,11 @@ +from django.db import models + +# Create your models here. +class Book(models.Model): + title = models.CharField(max_length=200) # 제목 + author = models.CharField(max_length=200) # 저자 + isbn = models.BigIntegerField() # 책 번호 + publication_date = models.DateField() # 출판일 + available = models.BooleanField(default=True) # 열람 가능 여부 + def __str__(self): + return self.title \ No newline at end of file diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/serializers.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/serializers.py" new file mode 100644 index 00000000..3fb76a56 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/serializers.py" @@ -0,0 +1,7 @@ +from rest_framework import serializers +from bookapp.models import Book + +class BookSerializer(serializers.ModelSerializer): + class Meta: + model = Book + fields = "__all__" \ No newline at end of file diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/tests.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/tests.py" new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/tests.py" @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/urls.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/urls.py" new file mode 100644 index 00000000..4613cc66 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/urls.py" @@ -0,0 +1,25 @@ +""" +URL configuration for bookproject project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.urls import path +from bookapp import views + +urlpatterns = [ + path('', views.BookListView.as_view()), + path('/', views.BookDetailsView.as_view()), + path('/reviews/', views.BookReviewListView.as_view()), + path('/reviews/', views.BookReviewDetailsView.as_view()), +] diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/views.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/views.py" new file mode 100644 index 00000000..4a347dc4 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookapp/views.py" @@ -0,0 +1,165 @@ +from bookapp.models import Book +from bookapp.serializers import BookSerializer +from rest_framework.response import Response +from rest_framework.decorators import api_view +from rest_framework import status +from rest_framework.views import APIView +from reviewapp.models import Review +from reviewapp.serializers import BookReviewSerializer + +# Create your views here. +class BookListView(APIView): + def get(self, request): + books = Book.objects.all() + serializer = BookSerializer(books, many=True) + return Response(serializer.data) + + def post(self, request): + serializer = BookSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class BookDetailsView(APIView): + def get(self, request, id): + try: + book = Book.objects.get(id=id) + except Book.DoesNotExist: + return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_404_NOT_FOUND) + + serializer = BookSerializer(book) + return Response(serializer.data) + + def put(self, request, id): + try: + book = Book.objects.get(id=id) + except Book.DoesNotExist: + return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_400_BAD_REQUEST) + + serializer = BookSerializer(book, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + else: + return Response(serializer.errors) + + def delete(self, request, id): + try: + book = Book.objects.get(id=id) + except Book.DoesNotExist: + return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_400_BAD_REQUEST) + + book.delete() + return Response(status=status.HTTP_204_NO_CONTENT) + +# /books/{id}/reviews/ +class BookReviewListView(APIView): + def get_book(self, id): + try: + return Book.objects.get(id=id) + except Book.DoesNotExist: + return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request, id): + book = self.get_book(id) + reviews = book.reviews.all() + serializer = BookReviewSerializer(reviews, many=True) + return Response(serializer.data) + + def post(self, request, id): + serializer = BookReviewSerializer(data=request.data) + book = self.get_book(id) + if serializer.is_valid(): + serializer.save( + book=book + ) + return Response(serializer.data) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class BookReviewDetailsView(APIView): + def get_review(self, id, review_id): + try: + book = Book.objects.get(id=id) + except Book.DoesNotExist: + return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_400_BAD_REQUEST) + + try: + return book.reviews.get(id=review_id) + except Review.DoesNotExist: + return Response({'message' : '리뷰를 찾지 못했습니다.'}, status=status.HTTP_400_BAD_REQUEST) + + def get(self, request, id, review_id): + review = self.get_review(id, review_id) + + serializer = BookReviewSerializer(review) + return Response(serializer.data) + + def put(self, request, id, review_id): + review = self.get_review(id, review_id) + book = Book.objects.get(id=id) + + serializer = BookReviewSerializer(review, data=request.data) + if serializer.is_valid(): + serializer.save( + book=book + ) + return Response(serializer.data) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def delete(self, request, id, review_id): + review = self.get_review(id, review_id) + + review.delete() + return Response(status=status.HTTP_204_NO_CONTENT) + +# @api_view(['GET', 'POST']) # ()의 디폴트는 GET +# def book_list(request): +# if request.method == 'GET': +# books = Book.objects.all() +# serializer = BookSerializer(books, many=True) +# return Response(serializer.data) + +# elif request.method == 'POST': +# serializer = BookSerializer(data=request.data) +# if serializer.is_valid(): +# serializer.save() +# return Response(serializer.data) +# else: +# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +# @api_view(['GET', 'PUT', 'DELETE']) +# def book_details(request, id): +# if request.method == 'GET': +# try: +# book = Book.objects.get(id=id) +# except Book.DoesNotExist: +# return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_404_NOT_FOUND) + +# serializer = BookSerializer(book) +# return Response(serializer.data) + +# elif request.method == 'PUT': +# try: +# book = Book.objects.get(id=id) +# except Book.DoesNotExist: +# return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_400_BAD_REQUEST) + +# serializer = BookSerializer(book, data=request.data) +# if serializer.is_valid(): +# serializer.save() +# return Response(serializer.data) +# else: +# return Response(serializer.errors) + +# elif request.method == 'DELETE': +# try: +# book = Book.objects.get(id=id) +# except Book.DoesNotExist: +# return Response({'message' : '도서를 찾지 못했습니다.'}, status=status.HTTP_400_BAD_REQUEST) + +# book.delete() +# return Response(status=status.HTTP_204_NO_CONTENT) \ No newline at end of file diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__init__.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__init__.py" new file mode 100644 index 00000000..e69de29b diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/__init__.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/__init__.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..54ac41a30248fa84fa93e5d10ec9ccc3d7cbef27 GIT binary patch literal 229 zcmYe~<>g`kg2zXK(!ex`Kn9FJjsp-EvjB+{hF}IwM!%H|MId1W@wFYub+(ELElw>e zj!DZ&x3sW~@y|i&dkr# uHI7Nj&(AI>%FjwoE{Tbc&&&`T!F`nlvPMK-%BpSDv8d5uT97ahk4CI*F3R*S_cDcaDGeoO@%8 zjHEgEwAa+u{Sl7)Et>Rx5-_<17yA(g#AzIgp|};Z<61n%;W!?+AN!8~o?97Q8PpPJ zKuaQCOPQQDWO8WmaZF3YJpuP4D5(u2&>$W~y7c21iJ>D~ycyF*(6Ba&M$jlaipJ0} zG`_`?n06FRpyOaOflhSBlb!JtiJ81MhE8k8&@0+FM4N!?I69-9Kxeg+=$yi3&Kvm{ z$EAxahGV({!=6VRlL;-C3Jup?ZBuszH$9|knm7zvF{;WFy@WesE#M_`^o zy{_eD!DoOZbb+smSH%1jxX%Kx?NTfd2V&TUM_fmMpSMgPDzWfekOWRIdtRH}$mNjR zWa4g+y%d_Rox@HJ5Obc}CQX*x%R09U?=54Y=hI1D#^inIRPlm4cA%e-h^@uoBM!Uccbc{NY$ytQ`k zLqw-9ZR8vG+)JkEXRlps(Twk?nW5nLE{xc89gmWR*kLu8=$HBs@ob+ka>0)0ZMHEB zPW34nW(;UPsIWm{nBZ}y-@}82X-3Pzv}9BVM!T(zQp`NPMGYHoxO7z;qIjL)4Nzs0 zLAHxv6ND@fQY?13Al{~^M5MsO{0m)hwLf4tMX|?U*_HKpWex^`YOq~LEOc)FVajMr zEWmIVvhFc`r!N-+2=2{8f;n(Ynw?_paqNGIJvw`x=XWXY@w)bsm#|24b;W3|LdS^j z&qfSa+fiq*9>1}keiVIbu^`t)^03{upe4lyKwt;$b&Oc-bf?-?vv9mqCigrYdZ`JC zxs+x2;Prl(gH|HK4c`pjID{p|YtUI<@MhQcMKMRLz63d9JDBP-e!=8R9QJe>K1|L? zg*$Sk81lu^q7tU0g$2Fyl&mhOrD{b9&h?VE!Av4TxdPjrr3{k@w+!F%g45mjsIkwX zy~)-rEfE2rM#xjw^|bWzN`7)GKRJ0d58)GXWv*0_L%t%-!&p<~#W1xXDaulHu}F`= z4iVh$d$CS!wGGCggOCop5J8<(#2Uj?@}jo)J**I$SVq(`cXusZ8r(cA(mZj9?b~JS znBMZf|9gk^-)*IZZjSo^w+;(X@oh{=^B}??cCtPT2Wn~|NWx(OEtLz-cVU5g+eO%7 z;tVmN<=k0wT{C?8}=Q?(^4~% zB1e@FrWLucD69G%`Gatf28q?tJ{To)?AfpMTl;=Bw>5 zw}hPs&vrg}RBzyH_bACu)q5JNzIOnN?aeUtE-a&O;hXTcf@5VE_~GG!u_Qmh$N9n3 qa4OC7@fdvLsps*3_~-l>pX|&dSu{V&KacZ0*WdgEct+m@Klm@!;8eK) literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/urls.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/__pycache__/urls.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..87976a5f47ea77320322c9e752c384ef651efd1e GIT binary patch literal 1108 zcmb7DL2J}N6i%|)-8OBdH?MQs2D%AW54xx*)zX3}wDuAL+iWt)W=&?o%xtwiNw!~#{DivJAIa9 zo)DN3zJrpO3&dz&V2*%^BSFz_j306ftpQC+8AdSy#&pb`CD`K_ag19Ag3%Qs<1O0` zsL!pS=aGm`()l#CF|jXME4H9n>~mX!ZAi~;AST5`8(iATv;-&anL&go$ zSWP_6n;j@Dm}32#3M#soNg-CDcp_&Vxc*0t#9JP3OOhq?4@DcqPx?VjA~2!ICrgv3 zJn?6vFb07XI39_`OC}0SD_di`#>Zhv!zUt3>~dksKdbE|G_t|KNv4L}D0myDX?%sI zR!ntR^@21e5a`lzSnDNzzgB#)_iM5%xxGIxS81S>cGon9^>!N?sNHtXm71Yc!Qu{s z23Ll2Q-v_NUy8H%8x|HMOqW2N#{v&^$vT{yYJwAm$qQOcKL!x3w%l!w8F#}Zx^nr7 zdyn8-EZ)VaiSnoK^P_j8XOF+Xdi(9ubJ*FUltesE&^7@GgB*MA==3Zd2hRRPvWj1 ztOr3wg#{J7EUcghVLyPMA|5?y}$I2GhGb$^tXuLbsr6pbv}hmx5xj^ua)_u&Z^K1EZ}~mUq6J_uKUb z@dXcQL_(30z7P+RR1Cpa?7^C*P7N%U zm4J_EDtKmMU;v@F#Z-23q3WTQP8T|3e|GV9bKU7kNTn09Xzj|H)8bG|=?F-by7Y)5c#%<=Kt^ literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/asgi.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/asgi.py" new file mode 100644 index 00000000..26bc45af --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/asgi.py" @@ -0,0 +1,16 @@ +""" +ASGI config for bookproject project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookproject.settings') + +application = get_asgi_application() diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/settings.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/settings.py" new file mode 100644 index 00000000..d2a201a5 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/settings.py" @@ -0,0 +1,128 @@ +""" +Django settings for bookproject project. + +Generated by 'django-admin startproject' using Django 4.2.13. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-u50uyo@g%l2t8)r##uvn!1im1lqx^dr8&w1bxo&ggu-6%fr)un' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'bookapp', + 'rest_framework', + 'reviewapp', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'bookproject.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'bookproject.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'bookdb', + 'USER': 'root', + 'PASSWORD': '' + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/urls.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/urls.py" new file mode 100644 index 00000000..8a636d24 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/urls.py" @@ -0,0 +1,24 @@ +""" +URL configuration for bookproject project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path +from django.conf.urls import include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('books/', include('bookapp.urls')), +] diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/wsgi.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/wsgi.py" new file mode 100644 index 00000000..c201d3e2 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/bookproject/wsgi.py" @@ -0,0 +1,16 @@ +""" +WSGI config for bookproject project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookproject.settings') + +application = get_wsgi_application() diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/manage.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/manage.py" new file mode 100644 index 00000000..8e920985 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/manage.py" @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bookproject.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__init__.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__init__.py" new file mode 100644 index 00000000..e69de29b diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/__init__.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/__init__.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..91c6cf4d1ce491b43f4bada77aaf4c68a015096b GIT binary patch literal 227 zcmYe~<>g`kf`r15G!Xq5L?8o3AjbiSi&=m~3PUi1CZpd); zRGe8-8S{G0jyElHVqUN8e$%uj#!ye;^@fdarcZf2d5*%HmK|?eXT&6>>K3OK7iZ?@ t=^DorrIux;mM0bz#KgyE=4F<|$LkeT-r}&y%}*)KNwovH@G}rI000N2OHlv- literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/admin.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/admin.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..378943af8e1dc87f2f1e7e837da1b40ef0f6b540 GIT binary patch literal 345 zcmYe~<>g`kf;lB2X-z=-F^GcP(&AaUkk22GZiK-CPIjJH@5Q*tx&fDE>v)UwRfaz9PBD87`e#Ju!;z2yA7 zlA_F{A|{~HD1jodd}2X?UT%I$YEE$x$mUxt#hE3kw>XMY(=&@pQj1nH6tMw?!NgaP zd!4OfLW@(2ieu7p(k(44WBl_{U5YZxQWbO+-gK;e)4k+%Ps7`(Ghc0;02B$%&(BLQ z&dgB=%>yba0vcTz^LovWH!X8wUa#za)3heWP*36YhK+BgPkB9gj>4Ok9dBA^#3ZHa r7N-^$XXfYW8ppt083Xp1UP0w84jZ6@OLJ1~7=i97W&sjBj6BQ$#B*&X literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/apps.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/apps.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..1f94e5b636169ac84575c678c97b1adc8cc9055b GIT binary patch literal 510 zcmYjOJ4?hs5Z+C4aC&zLVk@LgaRIUMM8p@`Dfno@!kTk8A(BhZ>_ySa#|eTKf{F@P z+8iioA^2O;T4`cw?`-tcftj6|@7s@^S-Vo{M_}t)t4;^bS6Tcw4T>pnp+jJZVIMWH zg)v${OkrvpF_q&Z)l!(Yf{el&u#kb1zUgLjHVhok-H@IChM|}O7ef#@vM@t%8(S(< zERCt4q9p^%eB0wYc28t)m~GmD8=9B-TZd+(;fi4^9} zfX_wVHrK0qcJh#&-lb>zA6K{U&*#ut3B$k@p0BS3K#7Fc+9m1zOV;j?w0oKz-jfki zPamJM>&x__qi5}x?D&S%c~x*ByfCPalHXAXj4#aQZluC13Y{sp<_(13ceBGQ^z57G*@^)M_9+stdaakCp|HvJF}Vj~E( zAgHL&qnAnrJqZ01{2TV_sb)QT_su4Syx~25@6Ei=c|o=65~Q#D8{4Y}A-}aUOBO0i z$f}7#5J4l-r;JjKjmYSm%%tQ#5vH(4L|8z3)}hI4VXu>hbAdjjK{KbH2#6FS>u!=f z>1gvT*{CcbtH&sSFe(T$!0cIq3gehEyTE3F9mFMJ2^;O@DRvN75W6sk(i0_7J~mlZ zRD?SstS08L7%y`k!EOk97uPWfmg4qu>qdm+_kye?NTw^YblQ){`XesxYc= z#`r|4Fg@_cXXp9o#2=p?!;uPXEtG01=8(|-cOXhYY6vGTs<_-s9iZgd5kq~y{2XG+G zB0y_-y|vuF$E+>fCV2&I#RO->yte7x)vKj++A{T~=c-ZMtTmjhB6>mGO`2k>D3#T8 mK%7Q%GL1<(dsT05;WLv#f0@*2vhwXo_jmMvE1eWGng0R5(dq#J literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/serializers.cpython-39.pyc" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/__pycache__/serializers.cpython-39.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..ee3335dfa68118e10376b74ae9033941183e330b GIT binary patch literal 799 zcmZuv&1=*^6rV{Z*>vr01$)q24ub4q1LDONkx~Uut>Cto5ExQtw!}`7b!PjqJ&9eR zPz6Cng&w^WD(FGz-!fNEnt1f?n?$-RcEY^8H}B2w_dX_WwVDXl)xEX;4UEutV@xjs z#u99`2!bJo1xj&YY0uoA~KvgRul#T?fHYh#3kkZZpiRS2!fVYcm48 z_hquf{jOggelCwb6)&ItdiU|?x7Tpe%kykgCBk3NAVjKUIEsqX zvvPbK6(>jK^V8^N;1^%MmhaydZ;t(Pd{(~r5N+_T;z}iX*1Z+UY9{eu5KRp$7>qPA zB{m=?-BGS5RMWhvMdkKM%-Fcf%noZUu+qyl8 zwjkC8!HNn!dMQ-UgU~<0zhSPP>aIsG9@Lj)YdgbC=9~8>@0;(vv5G}iz*dcxo7)*d z_#T7PO+qk>Bdp*=1uD8iOVq^{(TNyi;%0Q|oXWSb}!RMaz+*rF~$*2%?DKz0-=V$aeX zm3vZ?PzCq$G*8u@h^UYtZHS79RP-K6Y@={880K(eSghrx4AYoH8pKAk44OKdF~OcGuYsS(Rohp*UA#ttWM;c zjR33&C@-`F*0O@GxdvUH424xY2v!0kPcy_eP z<%aJ?;6+E@(8kr_Z%r#gzciBPZ!49+gGa$@FbD$@ zb1hU82^QkS2UuhR*X}TT4#k;|WAJ=+)e6#Ov4+H#SqoCA&ier{+k1eL<)~wMw$BNz zb0r~+^~B}s+){O}c9*Mu8-_KuF9cUGN;3W0#Z~pDv4Vn!M$@%tZp;`DJ*Wk29ZHj> z!HZ9Wosa!jPk+As@Z;-i+*$H{&kmVeTJg{&2wBuM`Ui)Dtv#c^zcYAtU`$s^{m)+p z?{@od_DX}T!@>4@qYjfHgdtLzylw8^kY5#t~k^Ng+~({FSnj zNXUdZGVB+AlRwhm#Iu~^`BZ=kttYakN?!cGSxFyOg`kf`r15G!Xq5L?8o3AjbiSi&=m~3PUi1CZpd7HjPcJ)bt%d$OI6TSc+;`=P4|-5Jq>TC&V03X0#GD4KR++MI5S5fG!Lkx zs5rBvGUoM~9dBCZ#JpbF{ibP6jG>;w>kS*0DMN-fJwEl(^ch{?@NFG?%{iWbMj$7kkcmc+;F6;$5hu*uC&Da}c>13C6H5HkP( DjMY!| literal 0 HcmV?d00001 diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/models.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/models.py" new file mode 100644 index 00000000..cb072af2 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/models.py" @@ -0,0 +1,13 @@ +from django.db import models +from bookapp.models import Book + +# Create your models here. +class Review(models.Model): + title = models.CharField(max_length=50) + content = models.CharField(max_length=200) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) # created_at과 updated_at는 거의 필수 + book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='reviews') # ForeignKey가 가리키는 book이 삭제되면 해당 review도 모두 삭제 + + def __str__(self): + return self.title \ No newline at end of file diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/serializers.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/serializers.py" new file mode 100644 index 00000000..70663601 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/serializers.py" @@ -0,0 +1,9 @@ +from rest_framework import serializers +from reviewapp.models import Review +from bookapp.serializers import BookSerializer + +class BookReviewSerializer(serializers.ModelSerializer): + book = BookSerializer(read_only=True) + class Meta: + model = Review + fields = '__all__' \ No newline at end of file diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/tests.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/tests.py" new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/tests.py" @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git "a/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/views.py" "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/views.py" new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ "b/4\354\243\274\354\260\250/\354\240\204\355\230\225\354\244\200/reviewapp/views.py" @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.