VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.036USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
0.629SP
└── Incoming DelegationsDeleg
+4.378SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.629SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.378SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "1023.059338 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7120.600468 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | ddangdol |
| id | 701562 |
| rank | 252,443 |
| reputation | 0 |
| created | 2018-01-31T01:57:03 |
| recovery_account | steem |
| proxy | None |
| post_count | 2 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2018-02-02T13:10:36 |
| last_root_post | 2018-02-02T09:24:12 |
| last_vote_time | 1970-01-01T00:00:00 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 1023.059338 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7120.600468 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2018-01-31T02:07:09 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"id": 701562,
"name": "ddangdol",
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM6yh4He7Egr3SCGEbK6Lwi1FwGdBwGhzXghx12yHFBGr8k2Kt7k",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM7UiV4bDvVADDi65X8HcZUR7zoT6QwXY2KkstbnTSnGAJ1xVDCb",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8hdPY8XibM9fC4ymj2XGrYh1cnXqBpb99Js19SWzaSHtFaRd6K",
1
]
]
},
"memo_key": "STM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ",
"json_metadata": "{\"profile\":{\"name\":\"Superanddo\"}}",
"posting_json_metadata": "{\"profile\":{\"name\":\"Superanddo\"}}",
"proxy": "",
"last_owner_update": "1970-01-01T00:00:00",
"last_account_update": "2018-01-31T02:07:09",
"created": "2018-01-31T01:57:03",
"mined": false,
"recovery_account": "steem",
"last_account_recovery": "1970-01-01T00:00:00",
"reset_account": "null",
"comment_count": 0,
"lifetime_vote_count": 0,
"post_count": 2,
"can_vote": true,
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779059979
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779059979
},
"voting_power": 0,
"balance": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"sbd_balance": "0.000 SBD",
"sbd_seconds": "0",
"sbd_seconds_last_update": "1970-01-01T00:00:00",
"sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"vesting_shares": "1023.059338 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "7120.600468 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"withdrawn": 0,
"to_withdraw": 0,
"withdraw_routes": 0,
"curation_rewards": 0,
"posting_rewards": 0,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"witnesses_voted_for": 0,
"last_post": "2018-02-02T13:10:36",
"last_root_post": "2018-02-02T09:24:12",
"last_vote_time": "1970-01-01T00:00:00",
"post_bandwidth": 0,
"pending_claimed_accounts": 0,
"vesting_balance": "0.000 STEEM",
"reputation": 0,
"transfer_history": [],
"market_history": [],
"post_history": [],
"vote_history": [],
"other_history": [],
"witness_votes": [],
"tags_usage": [],
"guest_bloggers": [],
"rank": 252443
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
2026/05/17 23:19:39
2026/05/17 23:19:39
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 7120.600468 VESTS |
| Transaction Info | Block #106142342/Trx 044b584e2dbcf0701a1f5036b89beccc222b9d15 |
View Raw JSON Data
{
"block": 106142342,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "7120.600468 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-17T23:19:39",
"trx_id": "044b584e2dbcf0701a1f5036b89beccc222b9d15",
"trx_in_block": 4,
"virtual_op": 0
}2026/05/12 00:06:06
2026/05/12 00:06:06
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 4408.390063 VESTS |
| Transaction Info | Block #105971234/Trx 0c5f6e140fef790b43f18c0ef6733561ec6e722f |
View Raw JSON Data
{
"block": 105971234,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "4408.390063 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-12T00:06:06",
"trx_id": "0c5f6e140fef790b43f18c0ef6733561ec6e722f",
"trx_in_block": 10,
"virtual_op": 0
}2026/04/25 22:42:09
2026/04/25 22:42:09
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 7133.116224 VESTS |
| Transaction Info | Block #105510023/Trx 44962de51b79744b2bcd69fddea420fd3bf471b3 |
View Raw JSON Data
{
"block": 105510023,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "7133.116224 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-04-25T22:42:09",
"trx_id": "44962de51b79744b2bcd69fddea420fd3bf471b3",
"trx_in_block": 2,
"virtual_op": 0
}2026/01/23 05:18:51
2026/01/23 05:18:51
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 4449.936882 VESTS |
| Transaction Info | Block #102848830/Trx eff176cc5aa018d2b7ba6937e65dfb5de98318e9 |
View Raw JSON Data
{
"block": 102848830,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "4449.936882 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-01-23T05:18:51",
"trx_id": "eff176cc5aa018d2b7ba6937e65dfb5de98318e9",
"trx_in_block": 3,
"virtual_op": 0
}2024/12/17 00:38:51
2024/12/17 00:38:51
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 4614.156079 VESTS |
| Transaction Info | Block #91295256/Trx 1c2d38227e7492bf26a09e718f8cc08645e43fb6 |
View Raw JSON Data
{
"block": 91295256,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "4614.156079 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2024-12-17T00:38:51",
"trx_id": "1c2d38227e7492bf26a09e718f8cc08645e43fb6",
"trx_in_block": 13,
"virtual_op": 0
}2023/11/13 16:22:15
2023/11/13 16:22:15
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 4783.289611 VESTS |
| Transaction Info | Block #79849480/Trx 462f0f07279f449754af55376de65dea7420a6c3 |
View Raw JSON Data
{
"block": 79849480,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "4783.289611 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-11-13T16:22:15",
"trx_id": "462f0f07279f449754af55376de65dea7420a6c3",
"trx_in_block": 3,
"virtual_op": 0
}2023/09/21 20:44:27
2023/09/21 20:44:27
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 7720.568397 VESTS |
| Transaction Info | Block #78346527/Trx f6df9418364576a0adb1ef6cb5486022b21e509d |
View Raw JSON Data
{
"block": 78346527,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "7720.568397 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-09-21T20:44:27",
"trx_id": "f6df9418364576a0adb1ef6cb5486022b21e509d",
"trx_in_block": 2,
"virtual_op": 0
}2022/11/03 10:40:36
2022/11/03 10:40:36
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 7942.249835 VESTS |
| Transaction Info | Block #69112035/Trx 9669a6f456dd1a6ac49da4e2300a3d80ec29f12d |
View Raw JSON Data
{
"block": 69112035,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "7942.249835 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-03T10:40:36",
"trx_id": "9669a6f456dd1a6ac49da4e2300a3d80ec29f12d",
"trx_in_block": 5,
"virtual_op": 0
}2022/01/17 10:01:36
2022/01/17 10:01:36
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 8162.783066 VESTS |
| Transaction Info | Block #60808304/Trx f8ce566bc159901993d76fb36a13f6f912807c27 |
View Raw JSON Data
{
"block": 60808304,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "8162.783066 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-01-17T10:01:36",
"trx_id": "f8ce566bc159901993d76fb36a13f6f912807c27",
"trx_in_block": 17,
"virtual_op": 0
}2021/06/13 23:59:03
2021/06/13 23:59:03
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 8346.551724 VESTS |
| Transaction Info | Block #54606737/Trx fdcefb3b775c64da8e37c34efee35b902c36b09f |
View Raw JSON Data
{
"block": 54606737,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "8346.551724 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-06-13T23:59:03",
"trx_id": "fdcefb3b775c64da8e37c34efee35b902c36b09f",
"trx_in_block": 5,
"virtual_op": 0
}2020/12/11 10:19:24
2020/12/11 10:19:24
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 8533.973698 VESTS |
| Transaction Info | Block #49354234/Trx fe31b226a1318a9a67ef8521ab0106c0e260feaf |
View Raw JSON Data
{
"block": 49354234,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "8533.973698 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-11T10:19:24",
"trx_id": "fe31b226a1318a9a67ef8521ab0106c0e260feaf",
"trx_in_block": 1,
"virtual_op": 0
}2020/12/06 03:56:27
2020/12/06 03:56:27
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49205795/Trx 6fd32fd8e82c70375817b40094fd189868ea63d2 |
View Raw JSON Data
{
"block": 49205795,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "1912.543513 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-06T03:56:27",
"trx_id": "6fd32fd8e82c70375817b40094fd189868ea63d2",
"trx_in_block": 1,
"virtual_op": 0
}2020/12/05 11:53:45
2020/12/05 11:53:45
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 8540.340337 VESTS |
| Transaction Info | Block #49186905/Trx 7a075012626c293b1a4baf90824a818d2c397c33 |
View Raw JSON Data
{
"block": 49186905,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "8540.340337 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-05T11:53:45",
"trx_id": "7a075012626c293b1a4baf90824a818d2c397c33",
"trx_in_block": 2,
"virtual_op": 0
}2020/11/02 13:54:48
2020/11/02 13:54:48
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #48255774/Trx 04e277262e26d734a9109129033b2f2bfc109f04 |
View Raw JSON Data
{
"block": 48255774,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "1920.017158 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-11-02T13:54:48",
"trx_id": "04e277262e26d734a9109129033b2f2bfc109f04",
"trx_in_block": 2,
"virtual_op": 0
}2020/05/09 04:53:00
2020/05/09 04:53:00
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 8742.986911 VESTS |
| Transaction Info | Block #43216035/Trx a95fbfd00b76e22105f4ba15e52f172bf0da16fb |
View Raw JSON Data
{
"block": 43216035,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "8742.986911 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-09T04:53:00",
"trx_id": "a95fbfd00b76e22105f4ba15e52f172bf0da16fb",
"trx_in_block": 0,
"virtual_op": 0
}2020/05/08 08:21:30
2020/05/08 08:21:30
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43191980/Trx 1a32b9a6bbbffd9e248aef2ffc9ab84ed5ecdec9 |
View Raw JSON Data
{
"block": 43191980,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "1953.311140 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T08:21:30",
"trx_id": "1a32b9a6bbbffd9e248aef2ffc9ab84ed5ecdec9",
"trx_in_block": 15,
"virtual_op": 0
}2020/04/15 21:04:51
2020/04/15 21:04:51
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 8755.964330 VESTS |
| Transaction Info | Block #42561938/Trx f15febbc53ea39dc5c0116339183f08e1779d69c |
View Raw JSON Data
{
"block": 42561938,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "8755.964330 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-04-15T21:04:51",
"trx_id": "f15febbc53ea39dc5c0116339183f08e1779d69c",
"trx_in_block": 1,
"virtual_op": 0
}2020/01/31 03:14:15
2020/01/31 03:14:15
| author | steemitboard |
| body | Congratulations @ddangdol! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ddangdol/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@ddangdol) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=ddangdol)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | ddangdol |
| parent permlink | django-models-introduction-to-models |
| permlink | steemitboard-notify-ddangdol-20200131t031414000z |
| title | |
| Transaction Info | Block #40398519/Trx a68a990f87e3af23ae848910d8d082c93280bc64 |
View Raw JSON Data
{
"block": 40398519,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @ddangdol! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ddangdol/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@ddangdol) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=ddangdol)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "ddangdol",
"parent_permlink": "django-models-introduction-to-models",
"permlink": "steemitboard-notify-ddangdol-20200131t031414000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2020-01-31T03:14:15",
"trx_id": "a68a990f87e3af23ae848910d8d082c93280bc64",
"trx_in_block": 7,
"virtual_op": 0
}2019/05/12 14:19:39
2019/05/12 14:19:39
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 8951.587135 VESTS |
| Transaction Info | Block #32844796/Trx e171e9b413fb24ee3bc33ff767332b66eb02e05c |
View Raw JSON Data
{
"block": 32844796,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "8951.587135 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2019-05-12T14:19:39",
"trx_id": "e171e9b413fb24ee3bc33ff767332b66eb02e05c",
"trx_in_block": 5,
"virtual_op": 0
}2019/01/31 03:07:51
2019/01/31 03:07:51
| author | steemitboard |
| body | Congratulations @ddangdol! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ddangdol/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@ddangdol)_</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | ddangdol |
| parent permlink | django-models-introduction-to-models |
| permlink | steemitboard-notify-ddangdol-20190131t030751000z |
| title | |
| Transaction Info | Block #29926086/Trx 1bc8769718eb2459033f2274400603c5ea995d79 |
View Raw JSON Data
{
"block": 29926086,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @ddangdol! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ddangdol/birthday1.png</td><td>Happy Birthday! - You are on the Steem blockchain for 1 year!</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@ddangdol)_</sub>\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "ddangdol",
"parent_permlink": "django-models-introduction-to-models",
"permlink": "steemitboard-notify-ddangdol-20190131t030751000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-01-31T03:07:51",
"trx_id": "1bc8769718eb2459033f2274400603c5ea995d79",
"trx_in_block": 7,
"virtual_op": 0
}2018/05/16 20:13:30
2018/05/16 20:13:30
| delegatee | ddangdol |
| delegator | steem |
| vesting shares | 9151.139570 VESTS |
| Transaction Info | Block #22489771/Trx 4474f956406ae4e195169e965ac1b17356b8fe7b |
View Raw JSON Data
{
"block": 22489771,
"op": [
"delegate_vesting_shares",
{
"delegatee": "ddangdol",
"delegator": "steem",
"vesting_shares": "9151.139570 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-16T20:13:30",
"trx_id": "4474f956406ae4e195169e965ac1b17356b8fe7b",
"trx_in_block": 3,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 14:14:42
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 14:14:42
| author | ddangdol |
| body | @@ -12,144 +12,8 @@ br%3E%0A -INSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E + %0A%3Ch1 @@ -670,29 +670,24 @@ .53.png%3C/p%3E%0A -%3Chr%3E%0A %3Ch2%3EUsing mo @@ -1276,21 +1276,16 @@ png%3C/p%3E%0A -%3Chr%3E%0A %3Ch2%3EFiel @@ -2099,13 +2099,8 @@ /p%3E%0A -%3Chr%3E%0A %3Ch3%3E @@ -2417,12 +2417,12 @@ /p%3E%0A +%0A %3Cp%3E -%0A %3Cstr @@ -2438,17 +2438,16 @@ /strong%3E -%0A %3Cbr%3E%0A%3Cst @@ -2538,19 +2538,17 @@ ng%3E. -%0A %3C/p%3E%0A -%3Cbr%3E%0A +%0A%3Cp%3E %3Cstr @@ -2569,13 +2569,40 @@ ong%3E -True +%3Cbr%3E%0A%3Cstrong%3ETrue%3C/strong%3E %EB%9D%BC%EB%A9%B4 %ED%95%B4 @@ -2616,22 +2616,17 @@ %EC%9B%8C%EB%91%98 %EC%88%98 %EC%9E%88%EB%8B%A4. - + %EA%B8%B0%EB%B3%B8%EA%B0%92%EC%9D%80 Fal @@ -2628,16 +2628,21 @@ %EC%9D%80 False. +%0A%3Cbr%3E %3Cbr%3E%0A%3Cst @@ -2878,25 +2878,34 @@ %EA%B0%92%EC%9D%80 %ED%95%84%EC%88%98%EB%8B%A4.%3Cbr%3E +%3Cbr%3E %0A +%0A%0A%3Cp%3E %3Cstrong%3Echoi @@ -2912,24 +2912,29 @@ ces%3C/strong%3E +%3Cbr%3E%0A %ED%95%84%EB%93%9C%EC%9D%98 %EC%84%A0%ED%83%9D%EC%A7%80%EB%A1%9C 2-t @@ -3029,16 +3029,257 @@ e%EB%A1%9C %EC%A0%9C%ED%95%9C%EB%90%9C%EB%8B%A4. +%3Cbr%3E%0Ahttps://steemitimages.com/DQmX2YgH1nqxc2HFQTjXPxwDBC5kaY28v9SzWrgUrrGaxj4/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252011.01.10.png%0A%3Cp%3E%0A %EA%B0%81 tuple%EC%9D%98 @@ -3332,17 +3332,25 @@ %EB%B3%B4%EC%9D%B8%EB%8B%A4.%3Cbr%3E -%0A +%3Cbr%3E%0A%0A%3Cp%3E %EB%AA%A8%EB%8D%B8 %EC%9D%B8%EC%8A%A4%ED%84%B4%EC%97%90%EC%84%9C @@ -3467,27 +3467,510 @@ sp;%EC%A0%91%EA%B7%BC%ED%95%A0 %EC%88%98 %EC%9E%88%EB%8B%A4. -%3Cbr +%0A%3C/p%3E%0Ahttps://steemitimages.com/DQmcXpCgMLPVXvKEZKS6MsLaV5XAsWWKfMHMnf84nWHv519/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252011.04.03.png%0A%3Cbr%3E%3Cbr%3E%0Ahttps://steemitimages.com/DQma2JWPYtmLGTM4T6SH5TTHKLiWfbwZZANQgmyZiNK4AtK/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252011.08.52.png%0A%3Cbr%3E%0A%3Cp %3E%0A%3Cstrong%3Ede @@ -3979,24 +3979,29 @@ ult%3C/strong%3E +%3Cbr%3E%0A %ED%95%84%EB%93%9C%EC%9D%98 %EA%B8%B0%EB%B3%B8%EA%B0%92%EC%9D%B4%EB%8B%A4. %EA%B0%92 @@ -4069,19 +4069,25 @@ %EB%A7%88%EB%8B%A4 %ED%98%B8%EC%B6%9C%EB%90%9C%EB%8B%A4. -%3Cbr +%0A%3C/p%3E%0A%0A%3Cp %3E%0A%3Cstron @@ -4106,16 +4106,21 @@ /strong%3E +%3Cbr%3E%0A %ED%8F%BC %EC%9C%84%EC%A0%AF%EA%B3%BC %ED%95%A8%EA%BB%98 @@ -4164,27 +4164,33 @@ %EB%AC%B8%EC%84%9C%ED%99%94 %EC%8B%9C %EC%9C%A0%EC%9A%A9%ED%95%98%EB%8B%A4. -%3Cbr +%0A%3C/p%3E%0A%0A%3Cp %3E%0A%3Cstrong%3Epr @@ -4198,16 +4198,38 @@ mary_key +%3C/strong%3E%3Cbr%3E%0A%3Cstrong%3E True&nbs @@ -4271,20 +4271,23 @@ ey %EA%B0%80 %EB%90%9C%EB%8B%A4. -%3Cbr%3E +%0A%3C/p%3E%0A%0A %0A%EB%AA%A8%EB%8D%B8%EC%97%90 %EC%96%B4%EB%96%A4 @@ -4659,24 +4659,171 @@ %EC%9D%BC%ED%95%B4%EC%95%BC%EB%A7%8C %ED%95%9C%EB%8B%A4.%3C/p%3E - +%0A%3Cp%3E%3Cbr%3E%0AINSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%0A %0A%3Ch3%3E%3Cstrong |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png","https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png","https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png","https://steemitimages.com/DQmetFwadpksBCsmsYAUMGXTn35JwboEjtPvPJ54UzpRNXQ/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.32.28.png","https://steemitimages.com/DQmX2YgH1nqxc2HFQTjXPxwDBC5kaY28v9SzWrgUrrGaxj4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.01.10.png","https://steemitimages.com/DQmcXpCgMLPVXvKEZKS6MsLaV5XAsWWKfMHMnf84nWHv519/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.04.03.png","https://steemitimages.com/DQma2JWPYtmLGTM4T6SH5TTHKLiWfbwZZANQgmyZiNK4AtK/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.08.52.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19519401/Trx a4922a0454387deb25b1785519500ae4a1521fd2 |
View Raw JSON Data
{
"block": 19519401,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -12,144 +12,8 @@\n br%3E%0A\n-INSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E\n \n+\n %0A%3Ch1\n@@ -670,29 +670,24 @@\n .53.png%3C/p%3E%0A\n-%3Chr%3E%0A\n %3Ch2%3EUsing mo\n@@ -1276,21 +1276,16 @@\n png%3C/p%3E%0A\n-%3Chr%3E%0A\n %3Ch2%3EFiel\n@@ -2099,13 +2099,8 @@\n /p%3E%0A\n-%3Chr%3E%0A\n %3Ch3%3E\n@@ -2417,12 +2417,12 @@\n /p%3E%0A\n+%0A\n %3Cp%3E\n-%0A\n %3Cstr\n@@ -2438,17 +2438,16 @@\n /strong%3E\n-%0A\n %3Cbr%3E%0A%3Cst\n@@ -2538,19 +2538,17 @@\n ng%3E.\n-%0A\n %3C/p%3E%0A\n-%3Cbr%3E%0A\n+%0A%3Cp%3E\n %3Cstr\n@@ -2569,13 +2569,40 @@\n ong%3E\n-True \n+%3Cbr%3E%0A%3Cstrong%3ETrue%3C/strong%3E \n %EB%9D%BC%EB%A9%B4 %ED%95%B4\n@@ -2616,22 +2616,17 @@\n %EC%9B%8C%EB%91%98 %EC%88%98 %EC%9E%88%EB%8B%A4.\n- \n+ \n %EA%B8%B0%EB%B3%B8%EA%B0%92%EC%9D%80 Fal\n@@ -2628,16 +2628,21 @@\n %EC%9D%80 False.\n+%0A%3Cbr%3E\n %3Cbr%3E%0A%3Cst\n@@ -2878,25 +2878,34 @@\n %EA%B0%92%EC%9D%80 %ED%95%84%EC%88%98%EB%8B%A4.%3Cbr%3E\n+%3Cbr%3E\n %0A\n+%0A%0A%3Cp%3E\n %3Cstrong%3Echoi\n@@ -2912,24 +2912,29 @@\n ces%3C/strong%3E\n+%3Cbr%3E%0A\n %ED%95%84%EB%93%9C%EC%9D%98 %EC%84%A0%ED%83%9D%EC%A7%80%EB%A1%9C 2-t\n@@ -3029,16 +3029,257 @@\n e%EB%A1%9C %EC%A0%9C%ED%95%9C%EB%90%9C%EB%8B%A4.\n+%3Cbr%3E%0Ahttps://steemitimages.com/DQmX2YgH1nqxc2HFQTjXPxwDBC5kaY28v9SzWrgUrrGaxj4/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252011.01.10.png%0A%3Cp%3E%0A\n %EA%B0%81 tuple%EC%9D%98\n@@ -3332,17 +3332,25 @@\n %EB%B3%B4%EC%9D%B8%EB%8B%A4.%3Cbr%3E\n-%0A\n+%3Cbr%3E%0A%0A%3Cp%3E\n %EB%AA%A8%EB%8D%B8 %EC%9D%B8%EC%8A%A4%ED%84%B4%EC%97%90%EC%84%9C\n@@ -3467,27 +3467,510 @@\n sp;%EC%A0%91%EA%B7%BC%ED%95%A0 %EC%88%98 %EC%9E%88%EB%8B%A4.\n-%3Cbr\n+%0A%3C/p%3E%0Ahttps://steemitimages.com/DQmcXpCgMLPVXvKEZKS6MsLaV5XAsWWKfMHMnf84nWHv519/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252011.04.03.png%0A%3Cbr%3E%3Cbr%3E%0Ahttps://steemitimages.com/DQma2JWPYtmLGTM4T6SH5TTHKLiWfbwZZANQgmyZiNK4AtK/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252011.08.52.png%0A%3Cbr%3E%0A%3Cp\n %3E%0A%3Cstrong%3Ede\n@@ -3979,24 +3979,29 @@\n ult%3C/strong%3E\n+%3Cbr%3E%0A\n %ED%95%84%EB%93%9C%EC%9D%98 %EA%B8%B0%EB%B3%B8%EA%B0%92%EC%9D%B4%EB%8B%A4. %EA%B0%92\n@@ -4069,19 +4069,25 @@\n %EB%A7%88%EB%8B%A4 %ED%98%B8%EC%B6%9C%EB%90%9C%EB%8B%A4.\n-%3Cbr\n+%0A%3C/p%3E%0A%0A%3Cp\n %3E%0A%3Cstron\n@@ -4106,16 +4106,21 @@\n /strong%3E\n+%3Cbr%3E%0A\n %ED%8F%BC %EC%9C%84%EC%A0%AF%EA%B3%BC %ED%95%A8%EA%BB%98\n@@ -4164,27 +4164,33 @@\n %EB%AC%B8%EC%84%9C%ED%99%94 %EC%8B%9C %EC%9C%A0%EC%9A%A9%ED%95%98%EB%8B%A4.\n-%3Cbr\n+%0A%3C/p%3E%0A%0A%3Cp\n %3E%0A%3Cstrong%3Epr\n@@ -4198,16 +4198,38 @@\n mary_key\n+%3C/strong%3E%3Cbr%3E%0A%3Cstrong%3E\n True&nbs\n@@ -4271,20 +4271,23 @@\n ey %EA%B0%80 %EB%90%9C%EB%8B%A4.\n-%3Cbr%3E\n+%0A%3C/p%3E%0A%0A\n %0A%EB%AA%A8%EB%8D%B8%EC%97%90 %EC%96%B4%EB%96%A4 \n@@ -4659,24 +4659,171 @@\n %EC%9D%BC%ED%95%B4%EC%95%BC%EB%A7%8C %ED%95%9C%EB%8B%A4.%3C/p%3E\n-\n \n+%0A%3Cp%3E%3Cbr%3E%0AINSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%0A\n %0A%3Ch3%3E%3Cstrong\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\",\"https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png\",\"https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png\",\"https://steemitimages.com/DQmetFwadpksBCsmsYAUMGXTn35JwboEjtPvPJ54UzpRNXQ/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.32.28.png\",\"https://steemitimages.com/DQmX2YgH1nqxc2HFQTjXPxwDBC5kaY28v9SzWrgUrrGaxj4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.01.10.png\",\"https://steemitimages.com/DQmcXpCgMLPVXvKEZKS6MsLaV5XAsWWKfMHMnf84nWHv519/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.04.03.png\",\"https://steemitimages.com/DQma2JWPYtmLGTM4T6SH5TTHKLiWfbwZZANQgmyZiNK4AtK/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.08.52.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T14:14:42",
"trx_id": "a4922a0454387deb25b1785519500ae4a1521fd2",
"trx_in_block": 38,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:41:48
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:41:48
| author | ddangdol |
| body | @@ -3,24 +3,157 @@ tml%3E%0A%3Cp%3E%3Cbr%3E - +%0AINSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E %3C/p%3E%0A%3Ch1%3E%3Cst @@ -344,16 +344,17 @@ n%EC%9D%84 %EC%A0%95%EC%9D%98%ED%95%9C%EB%8B%A4. - + first_na @@ -806,24 +806,29 @@ .53.png%3C/p%3E%0A +%3Chr%3E%0A %3Ch2%3EUsing mo @@ -985,16 +985,17 @@ %ED%95%9C%EB%8B%A4.%3Cbr%3E +%0A %3Cbr%3E%0A%EC%95%A0%ED%94%8C%EB%A6%AC @@ -1173,17 +1173,21 @@ %EA%B0%99%EC%9D%84 %EA%B2%83%EC%9D%B4%EB%8B%A4. - +%3C/p%3E%0A %3Cp%3Ehttps @@ -1420,148 +1420,12 @@ %3C/p%3E -%3Cbr%3E%0AINSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p +%0A%3Chr %3E%0A%3Ch @@ -1562,32 +1562,271 @@ %EC%A1%B0%EC%8B%AC%ED%95%B4%EB%9D%BC.%3Cbr%3E%0A%3C/p%3E%0A +%3Cp%3Ehttps://steemitimages.com/DQmetFwadpksBCsmsYAUMGXTn35JwboEjtPvPJ54UzpRNXQ/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.32.28.png%3C/p%3E%0A %3Ch3%3E%3Cstrong%3EFiel @@ -1942,16 +1942,32 @@ %EC%A7%80%EB%A5%BC %EA%B2%B0%EC%A0%95%ED%95%9C%EB%8B%A4. +%3C/p%3E%0A%3Cul%3E%0A %3Cli%3E %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%97%90 @@ -2017,16 +2017,28 @@ , TEXT). +%3C/li%3E%0A %3Cli%3E %ED%8F%BC %ED%95%84%EB%93%9C%EB%A5%BC %EB%A0%8C%EB%8D%94 @@ -2110,16 +2110,28 @@ ct>). +%3C/li%3E%0A %3Cli%3E Django %EC%96%B4 @@ -2171,16 +2171,31 @@ p;%EC%9C%A0%ED%9A%A8%EC%84%B1 %EA%B2%80%EC%82%AC +%3C/li%3E%0A%3C/ul%3E%0A%3Cp%3E Django%EC%97%90%EB%8A%94 @@ -2233,32 +2233,37 @@ %EC%84%9C %ED%99%95%EC%9D%B8%ED%95%A0 %EC%88%98 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A +%3Chr%3E%0A %3Ch3%3E%3Cstrong%3EFiel @@ -2454,20 +2454,23 @@ %EA%B0%80 %ED%95%84%EC%9A%94%ED%95%98%EB%8B%A4.%3C -br%3E%0A +/p%3E%0A%3Cp%3E %EB%98%90%ED%95%9C @@ -2556,26 +2556,30 @@ %EB%8A%94 %EA%B2%83%EB%93%A4%EC%9D%84 %EC%9A%94%EC%95%BD%ED%95%9C%EB%8B%A4.%3C -br +/p%3E%0A%3Cp %3E%0A%3Cstrong%3Enu @@ -2593,90 +2593,14 @@ ong%3E -If True, Django will store empty values as NULL in the database. Default is False. +%0A%3Cbr%3E%0A %3Cstr @@ -2686,16 +2686,22 @@ strong%3E. +%0A%3C/p%3E%0A %3Cbr%3E%0A%3Cst |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png","https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png","https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png","https://steemitimages.com/DQmetFwadpksBCsmsYAUMGXTn35JwboEjtPvPJ54UzpRNXQ/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.32.28.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518744/Trx 6bdcc962c89c4383878107914205cc311b6a0f24 |
View Raw JSON Data
{
"block": 19518744,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -3,24 +3,157 @@\n tml%3E%0A%3Cp%3E%3Cbr%3E\n-\n \n+%0AINSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E\n %3C/p%3E%0A%3Ch1%3E%3Cst\n@@ -344,16 +344,17 @@\n n%EC%9D%84 %EC%A0%95%EC%9D%98%ED%95%9C%EB%8B%A4.\n-\n \n+ \n first_na\n@@ -806,24 +806,29 @@\n .53.png%3C/p%3E%0A\n+%3Chr%3E%0A\n %3Ch2%3EUsing mo\n@@ -985,16 +985,17 @@\n %ED%95%9C%EB%8B%A4.%3Cbr%3E\n+%0A\n %3Cbr%3E%0A%EC%95%A0%ED%94%8C%EB%A6%AC\n@@ -1173,17 +1173,21 @@\n %EA%B0%99%EC%9D%84 %EA%B2%83%EC%9D%B4%EB%8B%A4.\n- \n+%3C/p%3E%0A\n %3Cp%3Ehttps\n@@ -1420,148 +1420,12 @@\n %3C/p%3E\n-%3Cbr%3E%0AINSTALLED_APPS %EC%97%90 %EC%83%88%EB%A1%9C%EC%9A%B4 %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84 %EC%B6%94%EA%B0%80%ED%95%98%EB%A9%B4 managepy migrate%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%9C%EB%8B%A4. %EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98 %ED%8C%8C%EC%9D%BC%EC%9D%84 %EB%A7%8C%EB%93%A4%EA%B8%B0 %EC%9C%84%ED%95%B4 manage.py makemigrations%EB%A5%BC %EC%8B%A4%ED%96%89%ED%95%B4%EC%95%BC %ED%95%98%EB%8A%94 %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p\n+%0A%3Chr\n %3E%0A%3Ch\n@@ -1562,32 +1562,271 @@\n %EC%A1%B0%EC%8B%AC%ED%95%B4%EB%9D%BC.%3Cbr%3E%0A%3C/p%3E%0A\n+%3Cp%3Ehttps://steemitimages.com/DQmetFwadpksBCsmsYAUMGXTn35JwboEjtPvPJ54UzpRNXQ/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.32.28.png%3C/p%3E%0A\n %3Ch3%3E%3Cstrong%3EFiel\n@@ -1942,16 +1942,32 @@\n %EC%A7%80%EB%A5%BC %EA%B2%B0%EC%A0%95%ED%95%9C%EB%8B%A4.\n+%3C/p%3E%0A%3Cul%3E%0A %3Cli%3E\n %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%97%90 \n@@ -2017,16 +2017,28 @@\n , TEXT).\n+%3C/li%3E%0A %3Cli%3E\n %ED%8F%BC %ED%95%84%EB%93%9C%EB%A5%BC %EB%A0%8C%EB%8D%94\n@@ -2110,16 +2110,28 @@\n ct>).\n+%3C/li%3E%0A %3Cli%3E\n Django %EC%96%B4\n@@ -2171,16 +2171,31 @@\n p;%EC%9C%A0%ED%9A%A8%EC%84%B1 %EA%B2%80%EC%82%AC\n+%3C/li%3E%0A%3C/ul%3E%0A%3Cp%3E\n Django%EC%97%90%EB%8A%94\n@@ -2233,32 +2233,37 @@\n %EC%84%9C %ED%99%95%EC%9D%B8%ED%95%A0 %EC%88%98 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A\n+%3Chr%3E%0A\n %3Ch3%3E%3Cstrong%3EFiel\n@@ -2454,20 +2454,23 @@\n %EA%B0%80 %ED%95%84%EC%9A%94%ED%95%98%EB%8B%A4.%3C\n-br%3E%0A\n+/p%3E%0A%3Cp%3E\n %EB%98%90%ED%95%9C\n@@ -2556,26 +2556,30 @@\n %EB%8A%94 %EA%B2%83%EB%93%A4%EC%9D%84 %EC%9A%94%EC%95%BD%ED%95%9C%EB%8B%A4.%3C\n-br\n+/p%3E%0A%3Cp\n %3E%0A%3Cstrong%3Enu\n@@ -2593,90 +2593,14 @@\n ong%3E\n-If True, Django will store empty values as NULL in the database. Default is False.\n+%0A%3Cbr%3E%0A\n %3Cstr\n@@ -2686,16 +2686,22 @@\n strong%3E.\n+%0A%3C/p%3E%0A\n %3Cbr%3E%0A%3Cst\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\",\"https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png\",\"https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png\",\"https://steemitimages.com/DQmetFwadpksBCsmsYAUMGXTn35JwboEjtPvPJ54UzpRNXQ/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.32.28.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:41:48",
"trx_id": "6bdcc962c89c4383878107914205cc311b6a0f24",
"trx_in_block": 13,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:31:06
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:31:06
| author | ddangdol |
| body | @@ -384,16 +384,24 @@ mpe.png%3C +/p%3E%0A%3Cp%3E%3C br%3E%0A%EC%9C%84 Pe @@ -846,16 +846,20 @@ %ED%95%9C%EB%8B%A4.%3Cbr%3E +%3Cbr%3E %0A%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98 @@ -1033,17 +1033,20 @@ %EA%B0%99%EC%9D%84 %EA%B2%83%EC%9D%B4%EB%8B%A4. -%0A + %3Cp%3E https:// @@ -1268,17 +1268,20 @@ 4.52.png -%0A +%3C/p%3E %3Cbr%3E%0AINS |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png","https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png","https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518530/Trx 5e8ddcee7cb9abf8b868aba42cbc4b928c1010b6 |
View Raw JSON Data
{
"block": 19518530,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -384,16 +384,24 @@\n mpe.png%3C\n+/p%3E%0A%3Cp%3E%3C\n br%3E%0A%EC%9C%84 Pe\n@@ -846,16 +846,20 @@\n %ED%95%9C%EB%8B%A4.%3Cbr%3E\n+%3Cbr%3E\n %0A%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98\n@@ -1033,17 +1033,20 @@\n %EA%B0%99%EC%9D%84 %EA%B2%83%EC%9D%B4%EB%8B%A4.\n-%0A\n+ %3Cp%3E\n https://\n@@ -1268,17 +1268,20 @@\n 4.52.png\n-%0A\n+%3C/p%3E\n %3Cbr%3E%0AINS\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\",\"https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png\",\"https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:31:06",
"trx_id": "5e8ddcee7cb9abf8b868aba42cbc4b928c1010b6",
"trx_in_block": 38,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:28:15
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:28:15
| author | ddangdol |
| body | @@ -388,20 +388,12 @@ png%3C -/p%3E%0A%3Cp%3E%3C br%3E%0A + %EC%9C%84 Pe @@ -664,36 +664,24 @@ .53.png%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Ch2%3EUsing mo @@ -839,16 +839,16 @@ %ED%95%9C%EB%8B%A4.%3Cbr%3E%0A - %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98 @@ -1017,24 +1017,257 @@ %EC%95%84%EB%9E%98%EC%99%80 %EA%B0%99%EC%9D%84 %EA%B2%83%EC%9D%B4%EB%8B%A4. +%0Ahttps://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.24.52.png%0A %3Cbr%3E%0AINSTALL |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png","https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png","https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518473/Trx 2a6220d61ae152a730798d5d476b9c25369d0fbd |
View Raw JSON Data
{
"block": 19518473,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -388,20 +388,12 @@\n png%3C\n-/p%3E%0A%3Cp%3E%3C\n br%3E%0A\n+\n %EC%9C%84 Pe\n@@ -664,36 +664,24 @@\n .53.png%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Ch2%3EUsing mo\n@@ -839,16 +839,16 @@\n %ED%95%9C%EB%8B%A4.%3Cbr%3E%0A\n-\n %EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%98 \n@@ -1017,24 +1017,257 @@\n %EC%95%84%EB%9E%98%EC%99%80 %EA%B0%99%EC%9D%84 %EA%B2%83%EC%9D%B4%EB%8B%A4.\n+%0Ahttps://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.24.52.png%0A\n %3Cbr%3E%0AINSTALL\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\",\"https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png\",\"https://steemitimages.com/DQmReiS5Urr6SBwRS6x76Fc4n6Vr8FJf2oEfTZAawsukCuq/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.24.52.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:28:15",
"trx_id": "2a6220d61ae152a730798d5d476b9c25369d0fbd",
"trx_in_block": 47,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:24:15
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:24:15
| author | ddangdol |
| body | @@ -1,16 +1,28 @@ %3Chtml%3E%0A%3C - +p%3E%3Cbr%3E%3C/p%3E%0A%3C h1%3E%3Cstro @@ -290,49 +290,8 @@ %EB%90%9C%EB%8B%A4.%3C -br%3E%0A%EC%9C%84 Person %EB%AA%A8%EB%8D%B8%EC%9D%80 %EC%95%84%EB%9E%98%EC%99%80 %EA%B0%99%EC%9D%80 %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4 %ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C /p%3E%0A @@ -388,16 +388,304 @@ png%3C/p%3E%0A +%3Cp%3E%3Cbr%3E%0A%EC%9C%84 Person %EB%AA%A8%EB%8D%B8%EC%9D%80 %EC%95%84%EB%9E%98%EC%99%80 %EA%B0%99%EC%9D%80 %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4 %ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C/p%3E%0A%3Cp%3Ehttps://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.21.53.png%3C/p%3E%0A %3Cp%3E%3Cbr%3E%3C @@ -1174,240 +1174,8 @@ %3C/p%3E -%0Ahttps://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.21.53.png + %0A%3Cp%3E |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png","https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518393/Trx eb5381f887076ad7dce32507277d6187eff0971a |
View Raw JSON Data
{
"block": 19518393,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -1,16 +1,28 @@\n %3Chtml%3E%0A%3C\n-\n \n+p%3E%3Cbr%3E%3C/p%3E%0A%3C\n h1%3E%3Cstro\n@@ -290,49 +290,8 @@\n %EB%90%9C%EB%8B%A4.%3C\n-br%3E%0A%EC%9C%84 Person %EB%AA%A8%EB%8D%B8%EC%9D%80 %EC%95%84%EB%9E%98%EC%99%80 %EA%B0%99%EC%9D%80 %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4 %ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C\n /p%3E%0A\n@@ -388,16 +388,304 @@\n png%3C/p%3E%0A\n+%3Cp%3E%3Cbr%3E%0A%EC%9C%84 Person %EB%AA%A8%EB%8D%B8%EC%9D%80 %EC%95%84%EB%9E%98%EC%99%80 %EA%B0%99%EC%9D%80 %EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4 %ED%85%8C%EC%9D%B4%EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C/p%3E%0A%3Cp%3Ehttps://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.21.53.png%3C/p%3E%0A\n %3Cp%3E%3Cbr%3E%3C\n@@ -1174,240 +1174,8 @@\n %3C/p%3E\n-%0Ahttps://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.21.53.png\n \n+\n %0A%3Cp%3E\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\",\"https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:24:15",
"trx_id": "eb5381f887076ad7dce32507277d6187eff0971a",
"trx_in_block": 52,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:23:12
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:23:12
| author | ddangdol |
| body | @@ -908,24 +908,268 @@ %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A +https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.21.53.png%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Ch2%3EFields%3C/ |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png","https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518372/Trx 69fab28b1d40b09c524da82401a13be9ec89f02a |
View Raw JSON Data
{
"block": 19518372,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -908,24 +908,268 @@\n %EA%B2%BD%EC%9A%B0%EB%8F%84 %EC%9E%88%EB%8B%A4.%3C/p%3E%0A\n+https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%25202018-02-02%2520%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%252010.21.53.png%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Ch2%3EFields%3C/\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\",\"https://steemitimages.com/DQmaCKApeHVVA5kgfpHWyDcdx3XxcHtpK9f9bwRwa4Wu8Af/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202018-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.21.53.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:23:12",
"trx_id": "69fab28b1d40b09c524da82401a13be9ec89f02a",
"trx_in_block": 6,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:16:15
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:16:15
| author | ddangdol |
| body | <html> <h1><strong>Model</strong></h1> <p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.</p> <h2>Quick example</h2> <p>아래 예제 모델은 first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br> 위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p> <p>https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png</p> <p><br></p> <h2>Using models</h2> <p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다. <strong>models.py</strong> 에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong> 에 추가해야 한다.<br> 애플리케이션의 모델이 <strong>myapp.models </strong>(<strong>manage.py startapp</strong> 스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong> 해당 부분은 아래와 같을 것이다.<br> INSTALLED_APPS 에 새로운 애플리케이션을 추가하면 managepy migrate를 실행해야 한다. 마이그레이션 파일을 만들기 위해 manage.py makemigrations를 실행해야 하는 경우도 있다.</p> <h2>Fields</h2> <p>모델에서 가장이고 유일하게 필수인 부분은 데이터베이스 필드 목록의 정의이다. 필드는 클래스 속성에 의해 지정된다. 필드 이름을 clean, save, delete 등과 같은 모델 API와 충돌하지 않도록 조심해라.<br> </p> <h3><strong>Field types</strong></h3> <p>모델의 각 필드는 해당 <strong>Field</strong> 클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g <input type="text">, <select>).Django 어드민과 자동으로 생성된 폼의 최소(기본적인) 유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p> <h3><strong>Field options</strong></h3> <p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어 <strong>CharField</strong> (해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong> 인수가 필요하다.<br> 또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br> <strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong> 라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br> <strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다. 기본값은 False.<br> <strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong> 인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong> 인수가 있다면 해당 필드 값은 필수다.<br> <strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br> 모델 인스턴에서 <strong>get_FOO_dispay()</strong> 메서드를 사용해서 선택된 <strong>choices </strong>필드의 디스플레이 값에 접근할 수 있다.<br> <strong>default</strong>필드의 기본값이다. 값 또는 callable 객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br> <strong>help_text</strong>폼 위젯과 함께 보이는 추가 "help" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br> <strong>primary_keyTrue </strong>일 경우 이 필드는 모델의 primary key 가 된다.<br> 모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong> 설정이 필요 없다.<br> primary key 필드는 읽기 전용이다. The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br> <strong>uniqueTrue</strong> 일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</p> <h3><strong>Automatic primary key fields</strong><br> </h3> <p>Django는 모델마다 기본으로 아래와 같은 필드를 제공한다.자동으로 증가되는 primary key이다.<br> 사용자 정의 primary key를 지정하려면, 필드 중 하나에 <strong>primary_key=True</strong>를 지정하면 된다. Django가 당신이 Field.primary_key를 설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br> 각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p> <h3><strong>Verbose field names</strong></h3> <p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OntToOneField</strong>를 제외한 각 필드 타입은 선택적으로 첫 번째 위치의 인수에 verbose name을 가진다. verbose name이 주어지지 않으면 Django는 필드의 속성 이름을 사용해서 밑줄을 공백으로 바꿔 자동으로 생성한다.<br> 아래 예제는 verbose name이 "person's first name"이다.아래 예제는 verbose name이 "first name"이다.<br> <strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OneToOneField</strong>는 첫 번째 인수로 모델 클래스를 요구하기 때문에, <strong>verbose_name</strong> 키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서 첫 문자를 자동으로 대문자로 표시해준다.</p> <h3><strong>Relationships</strong></h3> <p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one, many-to-many and one-to-one) 관계에 대해 정의하는 방법을 제공한다.<br> <strong>Many-to-one relationships</strong><br> 다대일 관계 정의는 <strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Car</strong> 모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong> 만을 갖는 경우 - 다음 정의를 사용한다.<br> 또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br> ForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p> <h3><strong>Many-to-manu relatioships</strong></h3> <p>다대다 관계 정의는 <strong>ManyToManyField</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ManyToManyField</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>객체가 있을 경우 - <strong>Topping</strong>이 여러 개의 <strong>Pizza</strong>에 있을 수 있고 <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>이 있을 경우 - 여기에 그 피자를 표현하는 방법이 있다.<strong>ForeignKey</strong>와 마찬가지로, 재귀 관계와 아직 정의되지 않은 모델과 관계를 만들 수 있다.<br> <strong>ManyToManyField</strong>(위 예제에서 <strong>toppings</strong>)의 이름은 관련된 모델 객체의 세트를 설명하는 복수형으로 권장되지만 필수는 아니다.<br> <strong>ManyToManyField</strong>가 어느 모델에 있는지는 중요하지 않지만, 반드시 하나의 모델에 있어야 한다.<br> 일반적으로 <strong>ManyToManyField</strong> 인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이 더 자연스럽기 때문이다.<br> 위 설정대로 <strong>Pizza</strong> 폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br> 단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을 다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다. 하지만 때로는 두 모델 간의 관계와 데이터가 추가로 필요할 수도 있다.<br> 예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br> Django는 이러한 상황에서 다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는 <strong>through</strong> 인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다. 중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br> 중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는 원본 모델에 대한 외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개 모델을 통해 다대다 관계를 가지고 있는 모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른 측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여 자신의 모델로부터 다대다 관계를 정의할 때는 symmetrical=False를 사용해야 한다. 이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여 관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong> 간의 관계를 만들 수 없다. <strong>Membership</strong> 모델 관계에 필요한 모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong> 및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br> 비슷한 이유로 <strong>remove()</strong> 메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이 다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong> 모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong> 객체에서 다대다 reverse relationship를 쿼리 하는 것이다.<strong>One-to-one relationships</strong><br> 일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br> 객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br> <strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br> 예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 "places"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에 <strong>OneToOneField</strong>(대상은 <strong>Place</strong>)로 만들 수 있다. 사실 일반적으로 암시적인 일대일 관계가 포함된 상속을 사용한다.<br> ForeignKey처럼, 재귀 관계가 정의될 수 있고 아직 정의되지 않은 모델도 참조할 수 있다.<br> OneToOneField는 또한 선택적 인수 parent_link를 제공한다.<br> OneToOneField 클래스는 모델에서 자동으로 primary key 된다. 원한다면 수동으로 primary_key 인수를 설정할 수 있다. 그리하여 한 모델이 여러 개의 OneToOneField 타입의 필드를 포함할 수 있다.</p> <h3><strong>Models across files</strong></h3> <p>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면 모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p> <h3><strong>Field name restrictions</strong></h3> <p>Django는 모델 필드 이름에 두 가지를 제한한다.<br> 파이썬 예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br> 필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br> Django는 모든 쿼리에 데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <strong>join</strong>, <strong>where</strong>, <strong>select</strong>와 같은 SQL 예약어를 허용한다.</p> <h3><strong>Custom field types</strong></h3> <p>기존 모델 필드 중 하나가 목적에 맞게 사용될 수 없거나 일반적인 데이터베이스 컬럼이 아닌 경우 자신만의 필드 클래스를 작성 가능하다.</p> <h3><strong>Meta options</strong></h3> <p>다음과 같이 inner <strong>class</strong> <strong>Meta</strong>를 사용하여 모델 메타데이터를 전달해라.모델 메타데이터는 정렬 옵션 (<strong>ordering</strong>), 데이터베이스 테이블 이름 (<strong>db_table</strong>), 또는 사람이 읽을 수 있는 단수와 복수 이름(<strong>verbose_name</strong>과 <strong>verbose_name_plural</strong>) 등등처럼 "필드가 아닌 모든 것이다". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</p> <h3><strong>Model attributes</strong></h3> <p><strong>objects</strong>모델의 속성 중에 가장 중요한 것이 <strong>Manager</strong>이다. Django 모델에 대해 데이터베이스 쿼리 작업이 제공되고 데이터베이스에서 인스턴스를 조회하는 데 사용되는 인터페이스다. 사용자 정의 <strong>Manager</strong>를 정의하지 않으면 기본 이름이 <strong>objects</strong>이다. 매니저는 모델 인스턴스가 아닌 모델 클래스를 통해서만 접근할 수 있다.</p> <h3><strong>Model methods</strong></h3> <p>모델에 사용자 메서드를 정의하여 객체의 "row-level" 기능을 추가한다. Manager 메서드는 "table-wide"의 일을 처리하기 위함이지만 모델 메서드는 특정 모델 인스턴스에서 동작해야 한다.<br> 모델 메서드는 비즈니스 로직을 한 곳(모델)에서 유지하게 해주는 중요한 기술이다.<br> 사용자 지정 메서드가 있는 모델 예제예제에서 마지막 메서드는 property다.<br> 각 모델에 자동으로 부여된 메서드들이 있고 재정의 가능하다. 하지만 대부분 아래 두 가지 메서드의 재정의를 한다.<br> <strong>__str__()</strong>모든 객체의 문자 표현을 리턴하는 파이썬 "magic method". 파이썬과 Django에서 모델 인스턴스를 강제로 문자열로 표시되어야 할 경우 사용된다. 특히 대화형 콘솔 또는 관리자 화면에서 객체를 보여줄 때 발생한다.<br> 매번 이 메서드 정의를 원할 것이다. 기본 메서드는 전혀 도움되지 않는다.<br> <strong>get_absolute_url()</strong>Django는 객체의 URL을 계산하는 방법을 제공한다. Django 관리자 인터페이스에서 이것을 사용하고 언제든 객체의 URL을 찾을 필요가 있다.<br> 고유하게 식별할 URL을 가진 객체는 이 메서드를 정의해야 한다.<br> </p> <h3><strong>Overring predefined model methods</strong></h3> <p>사용자 정의할 데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong> 동작 변경을 원하는 경우가 많다.<br> 동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br> 내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br> 또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당 인수들을 지원하는 것을 보장받는다.<br> <strong>Overridden model methods are not called on bulk operations</strong><br> <strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의 delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong> signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p> <h3><strong>Executing custom SQL</strong></h3> <p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에 사용자 정의 SQL문을 작성하는 것이다.</p> <h2><strong>Model inheritance</strong></h2> </html> |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518233/Trx ed2b6e9c83c7fea39a1d9280b568a60089efd5e2 |
View Raw JSON Data
{
"block": 19518233,
"op": [
"comment",
{
"author": "ddangdol",
"body": "<html>\n<h1><strong>Model</strong></h1>\n<p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.</p>\n<h2>Quick example</h2>\n<p>아래 예제 모델은 first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br>\n위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p>\n<p>https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png</p>\n<p><br></p>\n<h2>Using models</h2>\n<p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다. <strong>models.py</strong> 에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong> 에 추가해야 한다.<br>\n애플리케이션의 모델이 <strong>myapp.models </strong>(<strong>manage.py startapp</strong> 스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong> 해당 부분은 아래와 같을 것이다.<br>\nINSTALLED_APPS 에 새로운 애플리케이션을 추가하면 managepy migrate를 실행해야 한다. 마이그레이션 파일을 만들기 위해 manage.py makemigrations를 실행해야 하는 경우도 있다.</p>\n<h2>Fields</h2>\n<p>모델에서 가장이고 유일하게 필수인 부분은 데이터베이스 필드 목록의 정의이다. 필드는 클래스 속성에 의해 지정된다. 필드 이름을 clean, save, delete 등과 같은 모델 API와 충돌하지 않도록 조심해라.<br>\n</p>\n<h3><strong>Field types</strong></h3>\n<p>모델의 각 필드는 해당 <strong>Field</strong> 클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g <input type=\"text\">, <select>).Django 어드민과 자동으로 생성된 폼의 최소(기본적인) 유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p>\n<h3><strong>Field options</strong></h3>\n<p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어 <strong>CharField</strong> (해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong> 인수가 필요하다.<br>\n 또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br>\n<strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong> 라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br>\n<strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다. 기본값은 False.<br>\n<strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong> 인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong> 인수가 있다면 해당 필드 값은 필수다.<br>\n<strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br>\n모델 인스턴에서 <strong>get_FOO_dispay()</strong> 메서드를 사용해서 선택된 <strong>choices </strong>필드의 디스플레이 값에 접근할 수 있다.<br>\n<strong>default</strong>필드의 기본값이다. 값 또는 callable 객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br>\n<strong>help_text</strong>폼 위젯과 함께 보이는 추가 \"help\" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br>\n<strong>primary_keyTrue </strong>일 경우 이 필드는 모델의 primary key 가 된다.<br>\n모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong> 설정이 필요 없다.<br>\nprimary key 필드는 읽기 전용이다. The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br>\n<strong>uniqueTrue</strong> 일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</p>\n<h3><strong>Automatic primary key fields</strong><br>\n</h3>\n<p>Django는 모델마다 기본으로 아래와 같은 필드를 제공한다.자동으로 증가되는 primary key이다.<br>\n사용자 정의 primary key를 지정하려면, 필드 중 하나에 <strong>primary_key=True</strong>를 지정하면 된다. Django가 당신이 Field.primary_key를 설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br>\n각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p>\n<h3><strong>Verbose field names</strong></h3>\n<p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OntToOneField</strong>를 제외한 각 필드 타입은 선택적으로 첫 번째 위치의 인수에 verbose name을 가진다. verbose name이 주어지지 않으면 Django는 필드의 속성 이름을 사용해서 밑줄을 공백으로 바꿔 자동으로 생성한다.<br>\n아래 예제는 verbose name이 \"person's first name\"이다.아래 예제는 verbose name이 \"first name\"이다.<br>\n<strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OneToOneField</strong>는 첫 번째 인수로 모델 클래스를 요구하기 때문에, <strong>verbose_name</strong> 키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서 첫 문자를 자동으로 대문자로 표시해준다.</p>\n<h3><strong>Relationships</strong></h3>\n<p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one, many-to-many and one-to-one) 관계에 대해 정의하는 방법을 제공한다.<br>\n<strong>Many-to-one relationships</strong><br>\n다대일 관계 정의는 <strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Car</strong> 모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong> 만을 갖는 경우 - 다음 정의를 사용한다.<br>\n또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br>\nForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p>\n<h3><strong>Many-to-manu relatioships</strong></h3>\n<p>다대다 관계 정의는 <strong>ManyToManyField</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ManyToManyField</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>객체가 있을 경우 - <strong>Topping</strong>이 여러 개의 <strong>Pizza</strong>에 있을 수 있고 <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>이 있을 경우 - 여기에 그 피자를 표현하는 방법이 있다.<strong>ForeignKey</strong>와 마찬가지로, 재귀 관계와 아직 정의되지 않은 모델과 관계를 만들 수 있다.<br>\n<strong>ManyToManyField</strong>(위 예제에서 <strong>toppings</strong>)의 이름은 관련된 모델 객체의 세트를 설명하는 복수형으로 권장되지만 필수는 아니다.<br>\n<strong>ManyToManyField</strong>가 어느 모델에 있는지는 중요하지 않지만, 반드시 하나의 모델에 있어야 한다.<br>\n일반적으로 <strong>ManyToManyField</strong> 인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이 더 자연스럽기 때문이다.<br>\n위 설정대로 <strong>Pizza</strong> 폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br>\n단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을 다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다. 하지만 때로는 두 모델 간의 관계와 데이터가 추가로 필요할 수도 있다.<br>\n예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br>\nDjango는 이러한 상황에서 다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는 <strong>through</strong> 인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다. 중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br>\n중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는 원본 모델에 대한 외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개 모델을 통해 다대다 관계를 가지고 있는 모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른 측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여 자신의 모델로부터 다대다 관계를 정의할 때는 symmetrical=False를 사용해야 한다. 이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여 관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong> 간의 관계를 만들 수 없다. <strong>Membership</strong> 모델 관계에 필요한 모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong> 및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br>\n비슷한 이유로 <strong>remove()</strong> 메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이 다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong> 모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong> 객체에서 다대다 reverse relationship를 쿼리 하는 것이다.<strong>One-to-one relationships</strong><br>\n일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br>\n객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br>\n<strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br>\n예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 \"places\"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에 <strong>OneToOneField</strong>(대상은 <strong>Place</strong>)로 만들 수 있다. 사실 일반적으로 암시적인 일대일 관계가 포함된 상속을 사용한다.<br>\nForeignKey처럼, 재귀 관계가 정의될 수 있고 아직 정의되지 않은 모델도 참조할 수 있다.<br>\nOneToOneField는 또한 선택적 인수 parent_link를 제공한다.<br>\nOneToOneField 클래스는 모델에서 자동으로 primary key 된다. 원한다면 수동으로 primary_key 인수를 설정할 수 있다. 그리하여 한 모델이 여러 개의 OneToOneField 타입의 필드를 포함할 수 있다.</p>\n<h3><strong>Models across files</strong></h3>\n<p>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면 모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p>\n<h3><strong>Field name restrictions</strong></h3>\n<p>Django는 모델 필드 이름에 두 가지를 제한한다.<br>\n파이썬 예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br>\n필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br>\nDjango는 모든 쿼리에 데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <strong>join</strong>, <strong>where</strong>, <strong>select</strong>와 같은 SQL 예약어를 허용한다.</p>\n<h3><strong>Custom field types</strong></h3>\n<p>기존 모델 필드 중 하나가 목적에 맞게 사용될 수 없거나 일반적인 데이터베이스 컬럼이 아닌 경우 자신만의 필드 클래스를 작성 가능하다.</p>\n<h3><strong>Meta options</strong></h3>\n<p>다음과 같이 inner <strong>class</strong> <strong>Meta</strong>를 사용하여 모델 메타데이터를 전달해라.모델 메타데이터는 정렬 옵션 (<strong>ordering</strong>), 데이터베이스 테이블 이름 (<strong>db_table</strong>), 또는 사람이 읽을 수 있는 단수와 복수 이름(<strong>verbose_name</strong>과 <strong>verbose_name_plural</strong>) 등등처럼 \"필드가 아닌 모든 것이다\". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</p>\n<h3><strong>Model attributes</strong></h3>\n<p><strong>objects</strong>모델의 속성 중에 가장 중요한 것이 <strong>Manager</strong>이다. Django 모델에 대해 데이터베이스 쿼리 작업이 제공되고 데이터베이스에서 인스턴스를 조회하는 데 사용되는 인터페이스다. 사용자 정의 <strong>Manager</strong>를 정의하지 않으면 기본 이름이 <strong>objects</strong>이다. 매니저는 모델 인스턴스가 아닌 모델 클래스를 통해서만 접근할 수 있다.</p>\n<h3><strong>Model methods</strong></h3>\n<p>모델에 사용자 메서드를 정의하여 객체의 \"row-level\" 기능을 추가한다. Manager 메서드는 \"table-wide\"의 일을 처리하기 위함이지만 모델 메서드는 특정 모델 인스턴스에서 동작해야 한다.<br>\n모델 메서드는 비즈니스 로직을 한 곳(모델)에서 유지하게 해주는 중요한 기술이다.<br>\n사용자 지정 메서드가 있는 모델 예제예제에서 마지막 메서드는 property다.<br>\n각 모델에 자동으로 부여된 메서드들이 있고 재정의 가능하다. 하지만 대부분 아래 두 가지 메서드의 재정의를 한다.<br>\n<strong>__str__()</strong>모든 객체의 문자 표현을 리턴하는 파이썬 \"magic method\". 파이썬과 Django에서 모델 인스턴스를 강제로 문자열로 표시되어야 할 경우 사용된다. 특히 대화형 콘솔 또는 관리자 화면에서 객체를 보여줄 때 발생한다.<br>\n매번 이 메서드 정의를 원할 것이다. 기본 메서드는 전혀 도움되지 않는다.<br>\n<strong>get_absolute_url()</strong>Django는 객체의 URL을 계산하는 방법을 제공한다. Django 관리자 인터페이스에서 이것을 사용하고 언제든 객체의 URL을 찾을 필요가 있다.<br>\n고유하게 식별할 URL을 가진 객체는 이 메서드를 정의해야 한다.<br>\n</p>\n<h3><strong>Overring predefined model methods</strong></h3>\n<p>사용자 정의할 데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong> 동작 변경을 원하는 경우가 많다.<br>\n동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br>\n내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br>\n또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당 인수들을 지원하는 것을 보장받는다.<br>\n<strong>Overridden model methods are not called on bulk operations</strong><br>\n<strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의 delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong> signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p>\n<h3><strong>Executing custom SQL</strong></h3>\n<p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에 사용자 정의 SQL문을 작성하는 것이다.</p>\n<h2><strong>Model inheritance</strong></h2>\n</html>",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:16:15",
"trx_id": "ed2b6e9c83c7fea39a1d9280b568a60089efd5e2",
"trx_in_block": 22,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:15:18
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:15:18
| author | ddangdol |
| body | @@ -326,17 +326,8 @@ %0A%3Cp%3E -%3Cbr%3E%3C/p%3E( http @@ -412,17 +412,32 @@ ampe.png -) +%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E %0A%3Ch2%3EUsi |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518214/Trx f95264da135ad5189b63e13c5386284724b5c7fa |
View Raw JSON Data
{
"block": 19518214,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -326,17 +326,8 @@\n %0A%3Cp%3E\n-%3Cbr%3E%3C/p%3E(\n http\n@@ -412,17 +412,32 @@\n ampe.png\n-)\n+%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E\n %0A%3Ch2%3EUsi\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:15:18",
"trx_id": "f95264da135ad5189b63e13c5386284724b5c7fa",
"trx_in_block": 29,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:14:24
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:14:24
| author | ddangdol |
| body | @@ -334,27 +334,8 @@ %3C/p%3E -!%5Bquick_exampe.png%5D (htt |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518196/Trx ec7b6a5230c97c3ff4228ced5b9fdd78936519d2 |
View Raw JSON Data
{
"block": 19518196,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -334,27 +334,8 @@\n %3C/p%3E\n-!%5Bquick_exampe.png%5D\n (htt\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:14:24",
"trx_id": "ec7b6a5230c97c3ff4228ced5b9fdd78936519d2",
"trx_in_block": 22,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:13:54
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:13:54
| author | ddangdol |
| body | @@ -315,24 +315,147 @@ %EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C/p%3E%0A +%3Cp%3E%3Cbr%3E%3C/p%3E!%5Bquick_exampe.png%5D(https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png)%0A %3Ch2%3EUsing mo |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html","image":["https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png"]} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518186/Trx 797df8a1cbbc4182894a379096db4672e0a15407 |
View Raw JSON Data
{
"block": 19518186,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -315,24 +315,147 @@\n %EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C/p%3E%0A\n+%3Cp%3E%3Cbr%3E%3C/p%3E!%5Bquick_exampe.png%5D(https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png)%0A\n %3Ch2%3EUsing mo\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://steemitimages.com/DQmUYAeo4BmQ2wN6SasWLJUWZ7wSb8ZahXUVTUpVs5avj5P/quick_exampe.png\"]}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:13:54",
"trx_id": "797df8a1cbbc4182894a379096db4672e0a15407",
"trx_in_block": 42,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:13:18
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:13:18
| author | ddangdol |
| body | @@ -323,20 +323,8 @@ /p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Ch2%3E |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html"} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518174/Trx 08973050f04a7c5f3817dd532f0543a9b1417a48 |
View Raw JSON Data
{
"block": 19518174,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -323,20 +323,8 @@\n /p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Ch2%3E\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:13:18",
"trx_id": "08973050f04a7c5f3817dd532f0543a9b1417a48",
"trx_in_block": 9,
"virtual_op": 0
}2018/02/02 13:10:36
2018/02/02 13:10:36
| author | ddangdol |
| body | 사진올리기 엄청 헤맸었는데 감사합니다. 궁금한게 있는데 로컬이미지 업로드는 불가능하고 외부 이미지링크만 허용되는건가요?? 뉴비라서 ㅜㅜ 헷갈리네요!! |
| json metadata | {"tags":["kr"],"app":"steemit/0.1"} |
| parent author | gamwoosonge |
| parent permlink | 5iad3-a-to-z |
| permlink | re-gamwoosonge-5iad3-a-to-z-20180202t131056782z |
| title | |
| Transaction Info | Block #19518120/Trx ff80f28158f9af32afb50c8404f6911c637495bd |
View Raw JSON Data
{
"block": 19518120,
"op": [
"comment",
{
"author": "ddangdol",
"body": "사진올리기 엄청 헤맸었는데 감사합니다. 궁금한게 있는데 로컬이미지 업로드는 불가능하고 외부 이미지링크만 허용되는건가요?? 뉴비라서 ㅜㅜ 헷갈리네요!!",
"json_metadata": "{\"tags\":[\"kr\"],\"app\":\"steemit/0.1\"}",
"parent_author": "gamwoosonge",
"parent_permlink": "5iad3-a-to-z",
"permlink": "re-gamwoosonge-5iad3-a-to-z-20180202t131056782z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:10:36",
"trx_id": "ff80f28158f9af32afb50c8404f6911c637495bd",
"trx_in_block": 4,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 13:08:18
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 13:08:18
| author | ddangdol |
| body | <html> <h1><strong>Model</strong></h1> <p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.</p> <h2>Quick example</h2> <p>아래 예제 모델은 first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br> 위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p> <p><br></p> <h2>Using models</h2> <p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다. <strong>models.py</strong> 에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong> 에 추가해야 한다.<br> 애플리케이션의 모델이 <strong>myapp.models </strong>(<strong>manage.py startapp</strong> 스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong> 해당 부분은 아래와 같을 것이다.<br> INSTALLED_APPS 에 새로운 애플리케이션을 추가하면 managepy migrate를 실행해야 한다. 마이그레이션 파일을 만들기 위해 manage.py makemigrations를 실행해야 하는 경우도 있다.</p> <h2>Fields</h2> <p>모델에서 가장이고 유일하게 필수인 부분은 데이터베이스 필드 목록의 정의이다. 필드는 클래스 속성에 의해 지정된다. 필드 이름을 clean, save, delete 등과 같은 모델 API와 충돌하지 않도록 조심해라.<br> </p> <h3><strong>Field types</strong></h3> <p>모델의 각 필드는 해당 <strong>Field</strong> 클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g <input type="text">, <select>).Django 어드민과 자동으로 생성된 폼의 최소(기본적인) 유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p> <h3><strong>Field options</strong></h3> <p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어 <strong>CharField</strong> (해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong> 인수가 필요하다.<br> 또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br> <strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong> 라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br> <strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다. 기본값은 False.<br> <strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong> 인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong> 인수가 있다면 해당 필드 값은 필수다.<br> <strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br> 모델 인스턴에서 <strong>get_FOO_dispay()</strong> 메서드를 사용해서 선택된 <strong>choices </strong>필드의 디스플레이 값에 접근할 수 있다.<br> <strong>default</strong>필드의 기본값이다. 값 또는 callable 객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br> <strong>help_text</strong>폼 위젯과 함께 보이는 추가 "help" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br> <strong>primary_keyTrue </strong>일 경우 이 필드는 모델의 primary key 가 된다.<br> 모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong> 설정이 필요 없다.<br> primary key 필드는 읽기 전용이다. The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br> <strong>uniqueTrue</strong> 일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</p> <h3><strong>Automatic primary key fields</strong><br> </h3> <p>Django는 모델마다 기본으로 아래와 같은 필드를 제공한다.자동으로 증가되는 primary key이다.<br> 사용자 정의 primary key를 지정하려면, 필드 중 하나에 <strong>primary_key=True</strong>를 지정하면 된다. Django가 당신이 Field.primary_key를 설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br> 각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p> <h3><strong>Verbose field names</strong></h3> <p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OntToOneField</strong>를 제외한 각 필드 타입은 선택적으로 첫 번째 위치의 인수에 verbose name을 가진다. verbose name이 주어지지 않으면 Django는 필드의 속성 이름을 사용해서 밑줄을 공백으로 바꿔 자동으로 생성한다.<br> 아래 예제는 verbose name이 "person's first name"이다.아래 예제는 verbose name이 "first name"이다.<br> <strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OneToOneField</strong>는 첫 번째 인수로 모델 클래스를 요구하기 때문에, <strong>verbose_name</strong> 키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서 첫 문자를 자동으로 대문자로 표시해준다.</p> <h3><strong>Relationships</strong></h3> <p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one, many-to-many and one-to-one) 관계에 대해 정의하는 방법을 제공한다.<br> <strong>Many-to-one relationships</strong><br> 다대일 관계 정의는 <strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Car</strong> 모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong> 만을 갖는 경우 - 다음 정의를 사용한다.<br> 또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br> ForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p> <h3><strong>Many-to-manu relatioships</strong></h3> <p>다대다 관계 정의는 <strong>ManyToManyField</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ManyToManyField</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>객체가 있을 경우 - <strong>Topping</strong>이 여러 개의 <strong>Pizza</strong>에 있을 수 있고 <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>이 있을 경우 - 여기에 그 피자를 표현하는 방법이 있다.<strong>ForeignKey</strong>와 마찬가지로, 재귀 관계와 아직 정의되지 않은 모델과 관계를 만들 수 있다.<br> <strong>ManyToManyField</strong>(위 예제에서 <strong>toppings</strong>)의 이름은 관련된 모델 객체의 세트를 설명하는 복수형으로 권장되지만 필수는 아니다.<br> <strong>ManyToManyField</strong>가 어느 모델에 있는지는 중요하지 않지만, 반드시 하나의 모델에 있어야 한다.<br> 일반적으로 <strong>ManyToManyField</strong> 인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이 더 자연스럽기 때문이다.<br> 위 설정대로 <strong>Pizza</strong> 폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br> 단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을 다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다. 하지만 때로는 두 모델 간의 관계와 데이터가 추가로 필요할 수도 있다.<br> 예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br> Django는 이러한 상황에서 다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는 <strong>through</strong> 인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다. 중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br> 중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는 원본 모델에 대한 외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개 모델을 통해 다대다 관계를 가지고 있는 모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른 측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여 자신의 모델로부터 다대다 관계를 정의할 때는 symmetrical=False를 사용해야 한다. 이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여 관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong> 간의 관계를 만들 수 없다. <strong>Membership</strong> 모델 관계에 필요한 모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong> 및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br> 비슷한 이유로 <strong>remove()</strong> 메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이 다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong> 모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong> 객체에서 다대다 reverse relationship를 쿼리 하는 것이다.<strong>One-to-one relationships</strong><br> 일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br> 객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br> <strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br> 예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 "places"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에 <strong>OneToOneField</strong>(대상은 <strong>Place</strong>)로 만들 수 있다. 사실 일반적으로 암시적인 일대일 관계가 포함된 상속을 사용한다.<br> ForeignKey처럼, 재귀 관계가 정의될 수 있고 아직 정의되지 않은 모델도 참조할 수 있다.<br> OneToOneField는 또한 선택적 인수 parent_link를 제공한다.<br> OneToOneField 클래스는 모델에서 자동으로 primary key 된다. 원한다면 수동으로 primary_key 인수를 설정할 수 있다. 그리하여 한 모델이 여러 개의 OneToOneField 타입의 필드를 포함할 수 있다.</p> <h3><strong>Models across files</strong></h3> <p>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면 모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p> <h3><strong>Field name restrictions</strong></h3> <p>Django는 모델 필드 이름에 두 가지를 제한한다.<br> 파이썬 예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br> 필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br> Django는 모든 쿼리에 데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <strong>join</strong>, <strong>where</strong>, <strong>select</strong>와 같은 SQL 예약어를 허용한다.</p> <h3><strong>Custom field types</strong></h3> <p>기존 모델 필드 중 하나가 목적에 맞게 사용될 수 없거나 일반적인 데이터베이스 컬럼이 아닌 경우 자신만의 필드 클래스를 작성 가능하다.</p> <h3><strong>Meta options</strong></h3> <p>다음과 같이 inner <strong>class</strong> <strong>Meta</strong>를 사용하여 모델 메타데이터를 전달해라.모델 메타데이터는 정렬 옵션 (<strong>ordering</strong>), 데이터베이스 테이블 이름 (<strong>db_table</strong>), 또는 사람이 읽을 수 있는 단수와 복수 이름(<strong>verbose_name</strong>과 <strong>verbose_name_plural</strong>) 등등처럼 "필드가 아닌 모든 것이다". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</p> <h3><strong>Model attributes</strong></h3> <p><strong>objects</strong>모델의 속성 중에 가장 중요한 것이 <strong>Manager</strong>이다. Django 모델에 대해 데이터베이스 쿼리 작업이 제공되고 데이터베이스에서 인스턴스를 조회하는 데 사용되는 인터페이스다. 사용자 정의 <strong>Manager</strong>를 정의하지 않으면 기본 이름이 <strong>objects</strong>이다. 매니저는 모델 인스턴스가 아닌 모델 클래스를 통해서만 접근할 수 있다.</p> <h3><strong>Model methods</strong></h3> <p>모델에 사용자 메서드를 정의하여 객체의 "row-level" 기능을 추가한다. Manager 메서드는 "table-wide"의 일을 처리하기 위함이지만 모델 메서드는 특정 모델 인스턴스에서 동작해야 한다.<br> 모델 메서드는 비즈니스 로직을 한 곳(모델)에서 유지하게 해주는 중요한 기술이다.<br> 사용자 지정 메서드가 있는 모델 예제예제에서 마지막 메서드는 property다.<br> 각 모델에 자동으로 부여된 메서드들이 있고 재정의 가능하다. 하지만 대부분 아래 두 가지 메서드의 재정의를 한다.<br> <strong>__str__()</strong>모든 객체의 문자 표현을 리턴하는 파이썬 "magic method". 파이썬과 Django에서 모델 인스턴스를 강제로 문자열로 표시되어야 할 경우 사용된다. 특히 대화형 콘솔 또는 관리자 화면에서 객체를 보여줄 때 발생한다.<br> 매번 이 메서드 정의를 원할 것이다. 기본 메서드는 전혀 도움되지 않는다.<br> <strong>get_absolute_url()</strong>Django는 객체의 URL을 계산하는 방법을 제공한다. Django 관리자 인터페이스에서 이것을 사용하고 언제든 객체의 URL을 찾을 필요가 있다.<br> 고유하게 식별할 URL을 가진 객체는 이 메서드를 정의해야 한다.<br> </p> <h3><strong>Overring predefined model methods</strong></h3> <p>사용자 정의할 데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong> 동작 변경을 원하는 경우가 많다.<br> 동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br> 내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br> 또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당 인수들을 지원하는 것을 보장받는다.<br> <strong>Overridden model methods are not called on bulk operations</strong><br> <strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의 delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong> signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p> <h3><strong>Executing custom SQL</strong></h3> <p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에 사용자 정의 SQL문을 작성하는 것이다.</p> <h2><strong>Model inheritance</strong></h2> </html> |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html"} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19518074/Trx 4be8bbfd86eef08c6286f7909b9bae1e274b7965 |
View Raw JSON Data
{
"block": 19518074,
"op": [
"comment",
{
"author": "ddangdol",
"body": "<html>\n<h1><strong>Model</strong></h1>\n<p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.</p>\n<h2>Quick example</h2>\n<p>아래 예제 모델은 first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br>\n위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p>\n<p><br></p>\n<h2>Using models</h2>\n<p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다. <strong>models.py</strong> 에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong> 에 추가해야 한다.<br>\n애플리케이션의 모델이 <strong>myapp.models </strong>(<strong>manage.py startapp</strong> 스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong> 해당 부분은 아래와 같을 것이다.<br>\nINSTALLED_APPS 에 새로운 애플리케이션을 추가하면 managepy migrate를 실행해야 한다. 마이그레이션 파일을 만들기 위해 manage.py makemigrations를 실행해야 하는 경우도 있다.</p>\n<h2>Fields</h2>\n<p>모델에서 가장이고 유일하게 필수인 부분은 데이터베이스 필드 목록의 정의이다. 필드는 클래스 속성에 의해 지정된다. 필드 이름을 clean, save, delete 등과 같은 모델 API와 충돌하지 않도록 조심해라.<br>\n</p>\n<h3><strong>Field types</strong></h3>\n<p>모델의 각 필드는 해당 <strong>Field</strong> 클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g <input type=\"text\">, <select>).Django 어드민과 자동으로 생성된 폼의 최소(기본적인) 유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p>\n<h3><strong>Field options</strong></h3>\n<p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어 <strong>CharField</strong> (해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong> 인수가 필요하다.<br>\n 또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br>\n<strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong> 라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br>\n<strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다. 기본값은 False.<br>\n<strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong> 인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong> 인수가 있다면 해당 필드 값은 필수다.<br>\n<strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br>\n모델 인스턴에서 <strong>get_FOO_dispay()</strong> 메서드를 사용해서 선택된 <strong>choices </strong>필드의 디스플레이 값에 접근할 수 있다.<br>\n<strong>default</strong>필드의 기본값이다. 값 또는 callable 객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br>\n<strong>help_text</strong>폼 위젯과 함께 보이는 추가 \"help\" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br>\n<strong>primary_keyTrue </strong>일 경우 이 필드는 모델의 primary key 가 된다.<br>\n모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong> 설정이 필요 없다.<br>\nprimary key 필드는 읽기 전용이다. The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br>\n<strong>uniqueTrue</strong> 일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</p>\n<h3><strong>Automatic primary key fields</strong><br>\n</h3>\n<p>Django는 모델마다 기본으로 아래와 같은 필드를 제공한다.자동으로 증가되는 primary key이다.<br>\n사용자 정의 primary key를 지정하려면, 필드 중 하나에 <strong>primary_key=True</strong>를 지정하면 된다. Django가 당신이 Field.primary_key를 설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br>\n각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p>\n<h3><strong>Verbose field names</strong></h3>\n<p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OntToOneField</strong>를 제외한 각 필드 타입은 선택적으로 첫 번째 위치의 인수에 verbose name을 가진다. verbose name이 주어지지 않으면 Django는 필드의 속성 이름을 사용해서 밑줄을 공백으로 바꿔 자동으로 생성한다.<br>\n아래 예제는 verbose name이 \"person's first name\"이다.아래 예제는 verbose name이 \"first name\"이다.<br>\n<strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OneToOneField</strong>는 첫 번째 인수로 모델 클래스를 요구하기 때문에, <strong>verbose_name</strong> 키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서 첫 문자를 자동으로 대문자로 표시해준다.</p>\n<h3><strong>Relationships</strong></h3>\n<p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one, many-to-many and one-to-one) 관계에 대해 정의하는 방법을 제공한다.<br>\n<strong>Many-to-one relationships</strong><br>\n다대일 관계 정의는 <strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Car</strong> 모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong> 만을 갖는 경우 - 다음 정의를 사용한다.<br>\n또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br>\nForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p>\n<h3><strong>Many-to-manu relatioships</strong></h3>\n<p>다대다 관계 정의는 <strong>ManyToManyField</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ManyToManyField</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>객체가 있을 경우 - <strong>Topping</strong>이 여러 개의 <strong>Pizza</strong>에 있을 수 있고 <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>이 있을 경우 - 여기에 그 피자를 표현하는 방법이 있다.<strong>ForeignKey</strong>와 마찬가지로, 재귀 관계와 아직 정의되지 않은 모델과 관계를 만들 수 있다.<br>\n<strong>ManyToManyField</strong>(위 예제에서 <strong>toppings</strong>)의 이름은 관련된 모델 객체의 세트를 설명하는 복수형으로 권장되지만 필수는 아니다.<br>\n<strong>ManyToManyField</strong>가 어느 모델에 있는지는 중요하지 않지만, 반드시 하나의 모델에 있어야 한다.<br>\n일반적으로 <strong>ManyToManyField</strong> 인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이 더 자연스럽기 때문이다.<br>\n위 설정대로 <strong>Pizza</strong> 폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br>\n단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을 다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다. 하지만 때로는 두 모델 간의 관계와 데이터가 추가로 필요할 수도 있다.<br>\n예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br>\nDjango는 이러한 상황에서 다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는 <strong>through</strong> 인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다. 중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br>\n중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는 원본 모델에 대한 외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개 모델을 통해 다대다 관계를 가지고 있는 모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른 측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여 자신의 모델로부터 다대다 관계를 정의할 때는 symmetrical=False를 사용해야 한다. 이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여 관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong> 간의 관계를 만들 수 없다. <strong>Membership</strong> 모델 관계에 필요한 모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong> 및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br>\n비슷한 이유로 <strong>remove()</strong> 메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이 다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong> 모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong> 객체에서 다대다 reverse relationship를 쿼리 하는 것이다.<strong>One-to-one relationships</strong><br>\n일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br>\n객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br>\n<strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br>\n예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 \"places\"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에 <strong>OneToOneField</strong>(대상은 <strong>Place</strong>)로 만들 수 있다. 사실 일반적으로 암시적인 일대일 관계가 포함된 상속을 사용한다.<br>\nForeignKey처럼, 재귀 관계가 정의될 수 있고 아직 정의되지 않은 모델도 참조할 수 있다.<br>\nOneToOneField는 또한 선택적 인수 parent_link를 제공한다.<br>\nOneToOneField 클래스는 모델에서 자동으로 primary key 된다. 원한다면 수동으로 primary_key 인수를 설정할 수 있다. 그리하여 한 모델이 여러 개의 OneToOneField 타입의 필드를 포함할 수 있다.</p>\n<h3><strong>Models across files</strong></h3>\n<p>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면 모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p>\n<h3><strong>Field name restrictions</strong></h3>\n<p>Django는 모델 필드 이름에 두 가지를 제한한다.<br>\n파이썬 예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br>\n필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br>\nDjango는 모든 쿼리에 데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <strong>join</strong>, <strong>where</strong>, <strong>select</strong>와 같은 SQL 예약어를 허용한다.</p>\n<h3><strong>Custom field types</strong></h3>\n<p>기존 모델 필드 중 하나가 목적에 맞게 사용될 수 없거나 일반적인 데이터베이스 컬럼이 아닌 경우 자신만의 필드 클래스를 작성 가능하다.</p>\n<h3><strong>Meta options</strong></h3>\n<p>다음과 같이 inner <strong>class</strong> <strong>Meta</strong>를 사용하여 모델 메타데이터를 전달해라.모델 메타데이터는 정렬 옵션 (<strong>ordering</strong>), 데이터베이스 테이블 이름 (<strong>db_table</strong>), 또는 사람이 읽을 수 있는 단수와 복수 이름(<strong>verbose_name</strong>과 <strong>verbose_name_plural</strong>) 등등처럼 \"필드가 아닌 모든 것이다\". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</p>\n<h3><strong>Model attributes</strong></h3>\n<p><strong>objects</strong>모델의 속성 중에 가장 중요한 것이 <strong>Manager</strong>이다. Django 모델에 대해 데이터베이스 쿼리 작업이 제공되고 데이터베이스에서 인스턴스를 조회하는 데 사용되는 인터페이스다. 사용자 정의 <strong>Manager</strong>를 정의하지 않으면 기본 이름이 <strong>objects</strong>이다. 매니저는 모델 인스턴스가 아닌 모델 클래스를 통해서만 접근할 수 있다.</p>\n<h3><strong>Model methods</strong></h3>\n<p>모델에 사용자 메서드를 정의하여 객체의 \"row-level\" 기능을 추가한다. Manager 메서드는 \"table-wide\"의 일을 처리하기 위함이지만 모델 메서드는 특정 모델 인스턴스에서 동작해야 한다.<br>\n모델 메서드는 비즈니스 로직을 한 곳(모델)에서 유지하게 해주는 중요한 기술이다.<br>\n사용자 지정 메서드가 있는 모델 예제예제에서 마지막 메서드는 property다.<br>\n각 모델에 자동으로 부여된 메서드들이 있고 재정의 가능하다. 하지만 대부분 아래 두 가지 메서드의 재정의를 한다.<br>\n<strong>__str__()</strong>모든 객체의 문자 표현을 리턴하는 파이썬 \"magic method\". 파이썬과 Django에서 모델 인스턴스를 강제로 문자열로 표시되어야 할 경우 사용된다. 특히 대화형 콘솔 또는 관리자 화면에서 객체를 보여줄 때 발생한다.<br>\n매번 이 메서드 정의를 원할 것이다. 기본 메서드는 전혀 도움되지 않는다.<br>\n<strong>get_absolute_url()</strong>Django는 객체의 URL을 계산하는 방법을 제공한다. Django 관리자 인터페이스에서 이것을 사용하고 언제든 객체의 URL을 찾을 필요가 있다.<br>\n고유하게 식별할 URL을 가진 객체는 이 메서드를 정의해야 한다.<br>\n</p>\n<h3><strong>Overring predefined model methods</strong></h3>\n<p>사용자 정의할 데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong> 동작 변경을 원하는 경우가 많다.<br>\n동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br>\n내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br>\n또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당 인수들을 지원하는 것을 보장받는다.<br>\n<strong>Overridden model methods are not called on bulk operations</strong><br>\n<strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의 delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong> signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p>\n<h3><strong>Executing custom SQL</strong></h3>\n<p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에 사용자 정의 SQL문을 작성하는 것이다.</p>\n<h2><strong>Model inheritance</strong></h2>\n</html>",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T13:08:18",
"trx_id": "4be8bbfd86eef08c6286f7909b9bae1e274b7965",
"trx_in_block": 14,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 09:27:33
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 09:27:33
| author | ddangdol |
| body | @@ -5,17 +5,10 @@ l%3E%0A%3C -pre%3E%3Ccode +h1 %3E%3Cst @@ -17,17 +17,16 @@ ng%3EModel -s %3C/strong @@ -32,18 +32,10 @@ g%3E%3C/ -code%3E%3C/pre +h1 %3E%0A%3Cp @@ -114,21 +114,16 @@ %EB%B8%94%EA%B3%BC %EB%A7%A4%ED%95%91%EB%90%9C%EB%8B%A4. -%3Cbr%3E%0A %3C/p%3E%0A%3Ch2 @@ -315,24 +315,36 @@ %EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C/p%3E%0A +%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Ch2%3EUsing mo |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html"} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19513666/Trx 82b2fc3c42fdf52dba41904bcb7e94a5d1ce76bd |
View Raw JSON Data
{
"block": 19513666,
"op": [
"comment",
{
"author": "ddangdol",
"body": "@@ -5,17 +5,10 @@\n l%3E%0A%3C\n-pre%3E%3Ccode\n+h1\n %3E%3Cst\n@@ -17,17 +17,16 @@\n ng%3EModel\n-s\n %3C/strong\n@@ -32,18 +32,10 @@\n g%3E%3C/\n-code%3E%3C/pre\n+h1\n %3E%0A%3Cp\n@@ -114,21 +114,16 @@\n %EB%B8%94%EA%B3%BC %EB%A7%A4%ED%95%91%EB%90%9C%EB%8B%A4.\n-%3Cbr%3E%0A\n %3C/p%3E%0A%3Ch2\n@@ -315,24 +315,36 @@\n %EB%B8%94%EC%9D%84 %EB%A7%8C%EB%93%A0%EB%8B%A4.%3C/p%3E%0A\n+%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Ch2%3EUsing mo\n",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T09:27:33",
"trx_id": "82b2fc3c42fdf52dba41904bcb7e94a5d1ce76bd",
"trx_in_block": 20,
"virtual_op": 0
}ddangdolpublished a new post: django-models-introduction-to-models2018/02/02 09:24:12
ddangdolpublished a new post: django-models-introduction-to-models
2018/02/02 09:24:12
| author | ddangdol |
| body | <html> <pre><code><strong>Models</strong></code></pre> <p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.<br> </p> <h2>Quick example</h2> <p>아래 예제 모델은 first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br> 위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p> <h2>Using models</h2> <p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다. <strong>models.py</strong> 에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong> 에 추가해야 한다.<br> 애플리케이션의 모델이 <strong>myapp.models </strong>(<strong>manage.py startapp</strong> 스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong> 해당 부분은 아래와 같을 것이다.<br> INSTALLED_APPS 에 새로운 애플리케이션을 추가하면 managepy migrate를 실행해야 한다. 마이그레이션 파일을 만들기 위해 manage.py makemigrations를 실행해야 하는 경우도 있다.</p> <h2>Fields</h2> <p>모델에서 가장이고 유일하게 필수인 부분은 데이터베이스 필드 목록의 정의이다. 필드는 클래스 속성에 의해 지정된다. 필드 이름을 clean, save, delete 등과 같은 모델 API와 충돌하지 않도록 조심해라.<br> </p> <h3><strong>Field types</strong></h3> <p>모델의 각 필드는 해당 <strong>Field</strong> 클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g <input type="text">, <select>).Django 어드민과 자동으로 생성된 폼의 최소(기본적인) 유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p> <h3><strong>Field options</strong></h3> <p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어 <strong>CharField</strong> (해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong> 인수가 필요하다.<br> 또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br> <strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong> 라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br> <strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다. 기본값은 False.<br> <strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong> 인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong> 인수가 있다면 해당 필드 값은 필수다.<br> <strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br> 모델 인스턴에서 <strong>get_FOO_dispay()</strong> 메서드를 사용해서 선택된 <strong>choices </strong>필드의 디스플레이 값에 접근할 수 있다.<br> <strong>default</strong>필드의 기본값이다. 값 또는 callable 객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br> <strong>help_text</strong>폼 위젯과 함께 보이는 추가 "help" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br> <strong>primary_keyTrue </strong>일 경우 이 필드는 모델의 primary key 가 된다.<br> 모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong> 설정이 필요 없다.<br> primary key 필드는 읽기 전용이다. The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br> <strong>uniqueTrue</strong> 일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</p> <h3><strong>Automatic primary key fields</strong><br> </h3> <p>Django는 모델마다 기본으로 아래와 같은 필드를 제공한다.자동으로 증가되는 primary key이다.<br> 사용자 정의 primary key를 지정하려면, 필드 중 하나에 <strong>primary_key=True</strong>를 지정하면 된다. Django가 당신이 Field.primary_key를 설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br> 각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p> <h3><strong>Verbose field names</strong></h3> <p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OntToOneField</strong>를 제외한 각 필드 타입은 선택적으로 첫 번째 위치의 인수에 verbose name을 가진다. verbose name이 주어지지 않으면 Django는 필드의 속성 이름을 사용해서 밑줄을 공백으로 바꿔 자동으로 생성한다.<br> 아래 예제는 verbose name이 "person's first name"이다.아래 예제는 verbose name이 "first name"이다.<br> <strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OneToOneField</strong>는 첫 번째 인수로 모델 클래스를 요구하기 때문에, <strong>verbose_name</strong> 키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서 첫 문자를 자동으로 대문자로 표시해준다.</p> <h3><strong>Relationships</strong></h3> <p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one, many-to-many and one-to-one) 관계에 대해 정의하는 방법을 제공한다.<br> <strong>Many-to-one relationships</strong><br> 다대일 관계 정의는 <strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Car</strong> 모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong> 만을 갖는 경우 - 다음 정의를 사용한다.<br> 또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br> ForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p> <h3><strong>Many-to-manu relatioships</strong></h3> <p>다대다 관계 정의는 <strong>ManyToManyField</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ManyToManyField</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>객체가 있을 경우 - <strong>Topping</strong>이 여러 개의 <strong>Pizza</strong>에 있을 수 있고 <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>이 있을 경우 - 여기에 그 피자를 표현하는 방법이 있다.<strong>ForeignKey</strong>와 마찬가지로, 재귀 관계와 아직 정의되지 않은 모델과 관계를 만들 수 있다.<br> <strong>ManyToManyField</strong>(위 예제에서 <strong>toppings</strong>)의 이름은 관련된 모델 객체의 세트를 설명하는 복수형으로 권장되지만 필수는 아니다.<br> <strong>ManyToManyField</strong>가 어느 모델에 있는지는 중요하지 않지만, 반드시 하나의 모델에 있어야 한다.<br> 일반적으로 <strong>ManyToManyField</strong> 인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이 더 자연스럽기 때문이다.<br> 위 설정대로 <strong>Pizza</strong> 폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br> 단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을 다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다. 하지만 때로는 두 모델 간의 관계와 데이터가 추가로 필요할 수도 있다.<br> 예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br> Django는 이러한 상황에서 다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는 <strong>through</strong> 인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다. 중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br> 중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는 원본 모델에 대한 외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개 모델을 통해 다대다 관계를 가지고 있는 모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른 측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여 자신의 모델로부터 다대다 관계를 정의할 때는 symmetrical=False를 사용해야 한다. 이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여 관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong> 간의 관계를 만들 수 없다. <strong>Membership</strong> 모델 관계에 필요한 모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong> 및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br> 비슷한 이유로 <strong>remove()</strong> 메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이 다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong> 모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong> 객체에서 다대다 reverse relationship를 쿼리 하는 것이다.<strong>One-to-one relationships</strong><br> 일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br> 객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br> <strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br> 예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 "places"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에 <strong>OneToOneField</strong>(대상은 <strong>Place</strong>)로 만들 수 있다. 사실 일반적으로 암시적인 일대일 관계가 포함된 상속을 사용한다.<br> ForeignKey처럼, 재귀 관계가 정의될 수 있고 아직 정의되지 않은 모델도 참조할 수 있다.<br> OneToOneField는 또한 선택적 인수 parent_link를 제공한다.<br> OneToOneField 클래스는 모델에서 자동으로 primary key 된다. 원한다면 수동으로 primary_key 인수를 설정할 수 있다. 그리하여 한 모델이 여러 개의 OneToOneField 타입의 필드를 포함할 수 있다.</p> <h3><strong>Models across files</strong></h3> <p>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면 모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p> <h3><strong>Field name restrictions</strong></h3> <p>Django는 모델 필드 이름에 두 가지를 제한한다.<br> 파이썬 예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br> 필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br> Django는 모든 쿼리에 데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <strong>join</strong>, <strong>where</strong>, <strong>select</strong>와 같은 SQL 예약어를 허용한다.</p> <h3><strong>Custom field types</strong></h3> <p>기존 모델 필드 중 하나가 목적에 맞게 사용될 수 없거나 일반적인 데이터베이스 컬럼이 아닌 경우 자신만의 필드 클래스를 작성 가능하다.</p> <h3><strong>Meta options</strong></h3> <p>다음과 같이 inner <strong>class</strong> <strong>Meta</strong>를 사용하여 모델 메타데이터를 전달해라.모델 메타데이터는 정렬 옵션 (<strong>ordering</strong>), 데이터베이스 테이블 이름 (<strong>db_table</strong>), 또는 사람이 읽을 수 있는 단수와 복수 이름(<strong>verbose_name</strong>과 <strong>verbose_name_plural</strong>) 등등처럼 "필드가 아닌 모든 것이다". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</p> <h3><strong>Model attributes</strong></h3> <p><strong>objects</strong>모델의 속성 중에 가장 중요한 것이 <strong>Manager</strong>이다. Django 모델에 대해 데이터베이스 쿼리 작업이 제공되고 데이터베이스에서 인스턴스를 조회하는 데 사용되는 인터페이스다. 사용자 정의 <strong>Manager</strong>를 정의하지 않으면 기본 이름이 <strong>objects</strong>이다. 매니저는 모델 인스턴스가 아닌 모델 클래스를 통해서만 접근할 수 있다.</p> <h3><strong>Model methods</strong></h3> <p>모델에 사용자 메서드를 정의하여 객체의 "row-level" 기능을 추가한다. Manager 메서드는 "table-wide"의 일을 처리하기 위함이지만 모델 메서드는 특정 모델 인스턴스에서 동작해야 한다.<br> 모델 메서드는 비즈니스 로직을 한 곳(모델)에서 유지하게 해주는 중요한 기술이다.<br> 사용자 지정 메서드가 있는 모델 예제예제에서 마지막 메서드는 property다.<br> 각 모델에 자동으로 부여된 메서드들이 있고 재정의 가능하다. 하지만 대부분 아래 두 가지 메서드의 재정의를 한다.<br> <strong>__str__()</strong>모든 객체의 문자 표현을 리턴하는 파이썬 "magic method". 파이썬과 Django에서 모델 인스턴스를 강제로 문자열로 표시되어야 할 경우 사용된다. 특히 대화형 콘솔 또는 관리자 화면에서 객체를 보여줄 때 발생한다.<br> 매번 이 메서드 정의를 원할 것이다. 기본 메서드는 전혀 도움되지 않는다.<br> <strong>get_absolute_url()</strong>Django는 객체의 URL을 계산하는 방법을 제공한다. Django 관리자 인터페이스에서 이것을 사용하고 언제든 객체의 URL을 찾을 필요가 있다.<br> 고유하게 식별할 URL을 가진 객체는 이 메서드를 정의해야 한다.<br> </p> <h3><strong>Overring predefined model methods</strong></h3> <p>사용자 정의할 데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong> 동작 변경을 원하는 경우가 많다.<br> 동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br> 내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br> 또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당 인수들을 지원하는 것을 보장받는다.<br> <strong>Overridden model methods are not called on bulk operations</strong><br> <strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의 delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong> signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p> <h3><strong>Executing custom SQL</strong></h3> <p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에 사용자 정의 SQL문을 작성하는 것이다.</p> <h2><strong>Model inheritance</strong></h2> </html> |
| json metadata | {"tags":["django","models","introduction","inheritance","relationship"],"app":"steemit/0.1","format":"html"} |
| parent author | |
| parent permlink | django |
| permlink | django-models-introduction-to-models |
| title | Django Models - Introduction to models |
| Transaction Info | Block #19513599/Trx 2881bf33d9ca0a1e47d3101a2eb99e47fff6a743 |
View Raw JSON Data
{
"block": 19513599,
"op": [
"comment",
{
"author": "ddangdol",
"body": "<html>\n<pre><code><strong>Models</strong></code></pre>\n<p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.<br>\n</p>\n<h2>Quick example</h2>\n<p>아래 예제 모델은 first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br>\n위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p>\n<h2>Using models</h2>\n<p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다. <strong>models.py</strong> 에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong> 에 추가해야 한다.<br>\n애플리케이션의 모델이 <strong>myapp.models </strong>(<strong>manage.py startapp</strong> 스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong> 해당 부분은 아래와 같을 것이다.<br>\nINSTALLED_APPS 에 새로운 애플리케이션을 추가하면 managepy migrate를 실행해야 한다. 마이그레이션 파일을 만들기 위해 manage.py makemigrations를 실행해야 하는 경우도 있다.</p>\n<h2>Fields</h2>\n<p>모델에서 가장이고 유일하게 필수인 부분은 데이터베이스 필드 목록의 정의이다. 필드는 클래스 속성에 의해 지정된다. 필드 이름을 clean, save, delete 등과 같은 모델 API와 충돌하지 않도록 조심해라.<br>\n</p>\n<h3><strong>Field types</strong></h3>\n<p>모델의 각 필드는 해당 <strong>Field</strong> 클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g <input type=\"text\">, <select>).Django 어드민과 자동으로 생성된 폼의 최소(기본적인) 유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p>\n<h3><strong>Field options</strong></h3>\n<p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어 <strong>CharField</strong> (해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong> 인수가 필요하다.<br>\n 또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br>\n<strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong> 라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br>\n<strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다. 기본값은 False.<br>\n<strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong> 인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong> 인수가 있다면 해당 필드 값은 필수다.<br>\n<strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br>\n모델 인스턴에서 <strong>get_FOO_dispay()</strong> 메서드를 사용해서 선택된 <strong>choices </strong>필드의 디스플레이 값에 접근할 수 있다.<br>\n<strong>default</strong>필드의 기본값이다. 값 또는 callable 객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br>\n<strong>help_text</strong>폼 위젯과 함께 보이는 추가 \"help\" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br>\n<strong>primary_keyTrue </strong>일 경우 이 필드는 모델의 primary key 가 된다.<br>\n모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong> 설정이 필요 없다.<br>\nprimary key 필드는 읽기 전용이다. The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br>\n<strong>uniqueTrue</strong> 일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</p>\n<h3><strong>Automatic primary key fields</strong><br>\n</h3>\n<p>Django는 모델마다 기본으로 아래와 같은 필드를 제공한다.자동으로 증가되는 primary key이다.<br>\n사용자 정의 primary key를 지정하려면, 필드 중 하나에 <strong>primary_key=True</strong>를 지정하면 된다. Django가 당신이 Field.primary_key를 설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br>\n각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p>\n<h3><strong>Verbose field names</strong></h3>\n<p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OntToOneField</strong>를 제외한 각 필드 타입은 선택적으로 첫 번째 위치의 인수에 verbose name을 가진다. verbose name이 주어지지 않으면 Django는 필드의 속성 이름을 사용해서 밑줄을 공백으로 바꿔 자동으로 생성한다.<br>\n아래 예제는 verbose name이 \"person's first name\"이다.아래 예제는 verbose name이 \"first name\"이다.<br>\n<strong>ForeignKey</strong>, <strong>ManyToManyField</strong>, <strong>OneToOneField</strong>는 첫 번째 인수로 모델 클래스를 요구하기 때문에, <strong>verbose_name</strong> 키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서 첫 문자를 자동으로 대문자로 표시해준다.</p>\n<h3><strong>Relationships</strong></h3>\n<p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one, many-to-many and one-to-one) 관계에 대해 정의하는 방법을 제공한다.<br>\n<strong>Many-to-one relationships</strong><br>\n다대일 관계 정의는 <strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Car</strong> 모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong> 만을 갖는 경우 - 다음 정의를 사용한다.<br>\n또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br>\nForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p>\n<h3><strong>Many-to-manu relatioships</strong></h3>\n<p>다대다 관계 정의는 <strong>ManyToManyField</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ManyToManyField</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>객체가 있을 경우 - <strong>Topping</strong>이 여러 개의 <strong>Pizza</strong>에 있을 수 있고 <strong>Pizza</strong>에 여러 개의 <strong>Topping</strong>이 있을 경우 - 여기에 그 피자를 표현하는 방법이 있다.<strong>ForeignKey</strong>와 마찬가지로, 재귀 관계와 아직 정의되지 않은 모델과 관계를 만들 수 있다.<br>\n<strong>ManyToManyField</strong>(위 예제에서 <strong>toppings</strong>)의 이름은 관련된 모델 객체의 세트를 설명하는 복수형으로 권장되지만 필수는 아니다.<br>\n<strong>ManyToManyField</strong>가 어느 모델에 있는지는 중요하지 않지만, 반드시 하나의 모델에 있어야 한다.<br>\n일반적으로 <strong>ManyToManyField</strong> 인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이 더 자연스럽기 때문이다.<br>\n위 설정대로 <strong>Pizza</strong> 폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br>\n단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을 다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다. 하지만 때로는 두 모델 간의 관계와 데이터가 추가로 필요할 수도 있다.<br>\n예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br>\nDjango는 이러한 상황에서 다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는 <strong>through</strong> 인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다. 중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br>\n중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는 원본 모델에 대한 외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개 모델을 통해 다대다 관계를 가지고 있는 모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른 측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여 자신의 모델로부터 다대다 관계를 정의할 때는 symmetrical=False를 사용해야 한다. 이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여 관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong> 간의 관계를 만들 수 없다. <strong>Membership</strong> 모델 관계에 필요한 모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong> 및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br>\n비슷한 이유로 <strong>remove()</strong> 메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이 다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong> 모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong> 객체에서 다대다 reverse relationship를 쿼리 하는 것이다.<strong>One-to-one relationships</strong><br>\n일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br>\n객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br>\n<strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br>\n예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 \"places\"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에 <strong>OneToOneField</strong>(대상은 <strong>Place</strong>)로 만들 수 있다. 사실 일반적으로 암시적인 일대일 관계가 포함된 상속을 사용한다.<br>\nForeignKey처럼, 재귀 관계가 정의될 수 있고 아직 정의되지 않은 모델도 참조할 수 있다.<br>\nOneToOneField는 또한 선택적 인수 parent_link를 제공한다.<br>\nOneToOneField 클래스는 모델에서 자동으로 primary key 된다. 원한다면 수동으로 primary_key 인수를 설정할 수 있다. 그리하여 한 모델이 여러 개의 OneToOneField 타입의 필드를 포함할 수 있다.</p>\n<h3><strong>Models across files</strong></h3>\n<p>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면 모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p>\n<h3><strong>Field name restrictions</strong></h3>\n<p>Django는 모델 필드 이름에 두 가지를 제한한다.<br>\n파이썬 예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br>\n필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br>\nDjango는 모든 쿼리에 데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <strong>join</strong>, <strong>where</strong>, <strong>select</strong>와 같은 SQL 예약어를 허용한다.</p>\n<h3><strong>Custom field types</strong></h3>\n<p>기존 모델 필드 중 하나가 목적에 맞게 사용될 수 없거나 일반적인 데이터베이스 컬럼이 아닌 경우 자신만의 필드 클래스를 작성 가능하다.</p>\n<h3><strong>Meta options</strong></h3>\n<p>다음과 같이 inner <strong>class</strong> <strong>Meta</strong>를 사용하여 모델 메타데이터를 전달해라.모델 메타데이터는 정렬 옵션 (<strong>ordering</strong>), 데이터베이스 테이블 이름 (<strong>db_table</strong>), 또는 사람이 읽을 수 있는 단수와 복수 이름(<strong>verbose_name</strong>과 <strong>verbose_name_plural</strong>) 등등처럼 \"필드가 아닌 모든 것이다\". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</p>\n<h3><strong>Model attributes</strong></h3>\n<p><strong>objects</strong>모델의 속성 중에 가장 중요한 것이 <strong>Manager</strong>이다. Django 모델에 대해 데이터베이스 쿼리 작업이 제공되고 데이터베이스에서 인스턴스를 조회하는 데 사용되는 인터페이스다. 사용자 정의 <strong>Manager</strong>를 정의하지 않으면 기본 이름이 <strong>objects</strong>이다. 매니저는 모델 인스턴스가 아닌 모델 클래스를 통해서만 접근할 수 있다.</p>\n<h3><strong>Model methods</strong></h3>\n<p>모델에 사용자 메서드를 정의하여 객체의 \"row-level\" 기능을 추가한다. Manager 메서드는 \"table-wide\"의 일을 처리하기 위함이지만 모델 메서드는 특정 모델 인스턴스에서 동작해야 한다.<br>\n모델 메서드는 비즈니스 로직을 한 곳(모델)에서 유지하게 해주는 중요한 기술이다.<br>\n사용자 지정 메서드가 있는 모델 예제예제에서 마지막 메서드는 property다.<br>\n각 모델에 자동으로 부여된 메서드들이 있고 재정의 가능하다. 하지만 대부분 아래 두 가지 메서드의 재정의를 한다.<br>\n<strong>__str__()</strong>모든 객체의 문자 표현을 리턴하는 파이썬 \"magic method\". 파이썬과 Django에서 모델 인스턴스를 강제로 문자열로 표시되어야 할 경우 사용된다. 특히 대화형 콘솔 또는 관리자 화면에서 객체를 보여줄 때 발생한다.<br>\n매번 이 메서드 정의를 원할 것이다. 기본 메서드는 전혀 도움되지 않는다.<br>\n<strong>get_absolute_url()</strong>Django는 객체의 URL을 계산하는 방법을 제공한다. Django 관리자 인터페이스에서 이것을 사용하고 언제든 객체의 URL을 찾을 필요가 있다.<br>\n고유하게 식별할 URL을 가진 객체는 이 메서드를 정의해야 한다.<br>\n</p>\n<h3><strong>Overring predefined model methods</strong></h3>\n<p>사용자 정의할 데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong> 동작 변경을 원하는 경우가 많다.<br>\n동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br>\n내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br>\n또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당 인수들을 지원하는 것을 보장받는다.<br>\n<strong>Overridden model methods are not called on bulk operations</strong><br>\n<strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의 delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong> signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p>\n<h3><strong>Executing custom SQL</strong></h3>\n<p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에 사용자 정의 SQL문을 작성하는 것이다.</p>\n<h2><strong>Model inheritance</strong></h2>\n</html>",
"json_metadata": "{\"tags\":[\"django\",\"models\",\"introduction\",\"inheritance\",\"relationship\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}",
"parent_author": "",
"parent_permlink": "django",
"permlink": "django-models-introduction-to-models",
"title": "Django Models - Introduction to models"
}
],
"op_in_trx": 0,
"timestamp": "2018-02-02T09:24:12",
"trx_id": "2881bf33d9ca0a1e47d3101a2eb99e47fff6a743",
"trx_in_block": 44,
"virtual_op": 0
}ddangdolupdated their account properties2018/01/31 02:07:09
ddangdolupdated their account properties
2018/01/31 02:07:09
| account | ddangdol |
| json metadata | {"profile":{"name":"Superanddo"}} |
| memo key | STM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ |
| Transaction Info | Block #19447348/Trx 4db17b0eb4ba65c567c132bd63b9834ea7fe1213 |
View Raw JSON Data
{
"block": 19447348,
"op": [
"account_update",
{
"account": "ddangdol",
"json_metadata": "{\"profile\":{\"name\":\"Superanddo\"}}",
"memo_key": "STM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ"
}
],
"op_in_trx": 0,
"timestamp": "2018-01-31T02:07:09",
"trx_id": "4db17b0eb4ba65c567c132bd63b9834ea7fe1213",
"trx_in_block": 29,
"virtual_op": 0
}2018/01/31 01:57:03
2018/01/31 01:57:03
| active | {"account_auths":[],"key_auths":[["STM7UiV4bDvVADDi65X8HcZUR7zoT6QwXY2KkstbnTSnGAJ1xVDCb",1]],"weight_threshold":1} |
| creator | steem |
| delegation | 29700.000000 VESTS |
| extensions | [] |
| fee | 0.500 STEEM |
| json metadata | |
| memo key | STM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ |
| new account name | ddangdol |
| owner | {"account_auths":[],"key_auths":[["STM6yh4He7Egr3SCGEbK6Lwi1FwGdBwGhzXghx12yHFBGr8k2Kt7k",1]],"weight_threshold":1} |
| posting | {"account_auths":[],"key_auths":[["STM8hdPY8XibM9fC4ymj2XGrYh1cnXqBpb99Js19SWzaSHtFaRd6K",1]],"weight_threshold":1} |
| Transaction Info | Block #19447147/Trx a0d5651190ba484b5bef4ecbfe273b8407b0cf2a |
View Raw JSON Data
{
"block": 19447147,
"op": [
"account_create_with_delegation",
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM7UiV4bDvVADDi65X8HcZUR7zoT6QwXY2KkstbnTSnGAJ1xVDCb",
1
]
],
"weight_threshold": 1
},
"creator": "steem",
"delegation": "29700.000000 VESTS",
"extensions": [],
"fee": "0.500 STEEM",
"json_metadata": "",
"memo_key": "STM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ",
"new_account_name": "ddangdol",
"owner": {
"account_auths": [],
"key_auths": [
[
"STM6yh4He7Egr3SCGEbK6Lwi1FwGdBwGhzXghx12yHFBGr8k2Kt7k",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM8hdPY8XibM9fC4ymj2XGrYh1cnXqBpb99Js19SWzaSHtFaRd6K",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2018-01-31T01:57:03",
"trx_id": "a0d5651190ba484b5bef4ecbfe273b8407b0cf2a",
"trx_in_block": 24,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779059979
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779059979
},
"rc_account": {
"account": "ddangdol",
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779059979
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "10164408779"
}
}Account Metadata
| POSTING JSON METADATA | |
| profile | {"name":"Superanddo"} |
| JSON METADATA | |
| profile | {"name":"Superanddo"} |
{
"posting_json_metadata": {
"profile": {
"name": "Superanddo"
}
},
"json_metadata": {
"profile": {
"name": "Superanddo"
}
}
}Auth Keys
Owner
Single Signature
Public Keys
STM6yh4He7Egr3SCGEbK6Lwi1FwGdBwGhzXghx12yHFBGr8k2Kt7k1/1
Active
Single Signature
Public Keys
STM7UiV4bDvVADDi65X8HcZUR7zoT6QwXY2KkstbnTSnGAJ1xVDCb1/1
Posting
Single Signature
Public Keys
STM8hdPY8XibM9fC4ymj2XGrYh1cnXqBpb99Js19SWzaSHtFaRd6K1/1
Memo
STM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ
{
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM6yh4He7Egr3SCGEbK6Lwi1FwGdBwGhzXghx12yHFBGr8k2Kt7k",
1
]
]
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM7UiV4bDvVADDi65X8HcZUR7zoT6QwXY2KkstbnTSnGAJ1xVDCb",
1
]
]
},
"posting": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [
[
"STM8hdPY8XibM9fC4ymj2XGrYh1cnXqBpb99Js19SWzaSHtFaRd6K",
1
]
]
},
"memo": "STM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ"
}Witness Votes
0 / 30
No active witness votes.
[]