Ecoer Logo
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 Deleg
+4.378SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.629SP
Delegated Out
0.000SP
Delegation In
4.378SP
Effective Power
5.007SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "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

nameddangdol
id701562
rank252,443
reputation0
created2018-01-31T01:57:03
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-02-02T13:10:36
last_root_post2018-02-02T09:24:12
last_vote_time1970-01-01T00:00:00
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1023.059338 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7120.600468 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-01-31T02:07:09
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-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

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.378 SP to @ddangdol
2026/05/17 23:19:39
delegateeddangdol
delegatorsteem
vesting shares7120.600468 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.710 SP to @ddangdol
2026/05/12 00:06:06
delegateeddangdol
delegatorsteem
vesting shares4408.390063 VESTS
Transaction InfoBlock #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
}
steemdelegated 4.386 SP to @ddangdol
2026/04/25 22:42:09
delegateeddangdol
delegatorsteem
vesting shares7133.116224 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.736 SP to @ddangdol
2026/01/23 05:18:51
delegateeddangdol
delegatorsteem
vesting shares4449.936882 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.837 SP to @ddangdol
2024/12/17 00:38:51
delegateeddangdol
delegatorsteem
vesting shares4614.156079 VESTS
Transaction InfoBlock #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
}
steemdelegated 2.941 SP to @ddangdol
2023/11/13 16:22:15
delegateeddangdol
delegatorsteem
vesting shares4783.289611 VESTS
Transaction InfoBlock #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
}
steemdelegated 4.747 SP to @ddangdol
2023/09/21 20:44:27
delegateeddangdol
delegatorsteem
vesting shares7720.568397 VESTS
Transaction InfoBlock #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
}
steemdelegated 4.883 SP to @ddangdol
2022/11/03 10:40:36
delegateeddangdol
delegatorsteem
vesting shares7942.249835 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.019 SP to @ddangdol
2022/01/17 10:01:36
delegateeddangdol
delegatorsteem
vesting shares8162.783066 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.132 SP to @ddangdol
2021/06/13 23:59:03
delegateeddangdol
delegatorsteem
vesting shares8346.551724 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.247 SP to @ddangdol
2020/12/11 10:19:24
delegateeddangdol
delegatorsteem
vesting shares8533.973698 VESTS
Transaction InfoBlock #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
}
steemdelegated 1.176 SP to @ddangdol
2020/12/06 03:56:27
delegateeddangdol
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.251 SP to @ddangdol
2020/12/05 11:53:45
delegateeddangdol
delegatorsteem
vesting shares8540.340337 VESTS
Transaction InfoBlock #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
}
steemdelegated 1.180 SP to @ddangdol
2020/11/02 13:54:48
delegateeddangdol
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.375 SP to @ddangdol
2020/05/09 04:53:00
delegateeddangdol
delegatorsteem
vesting shares8742.986911 VESTS
Transaction InfoBlock #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
}
steemdelegated 1.201 SP to @ddangdol
2020/05/08 08:21:30
delegateeddangdol
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #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
}
steemdelegated 5.383 SP to @ddangdol
2020/04/15 21:04:51
delegateeddangdol
delegatorsteem
vesting shares8755.964330 VESTS
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @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 authorddangdol
parent permlinkdjango-models-introduction-to-models
permlinksteemitboard-notify-ddangdol-20200131t031414000z
title
Transaction InfoBlock #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
}
steemdelegated 5.504 SP to @ddangdol
2019/05/12 14:19:39
delegateeddangdol
delegatorsteem
vesting shares8951.587135 VESTS
Transaction InfoBlock #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
authorsteemitboard
bodyCongratulations @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 authorddangdol
parent permlinkdjango-models-introduction-to-models
permlinksteemitboard-notify-ddangdol-20190131t030751000z
title
Transaction InfoBlock #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
}
steemdelegated 5.626 SP to @ddangdol
2018/05/16 20:13:30
delegateeddangdol
delegatorsteem
vesting shares9151.139570 VESTS
Transaction InfoBlock #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
}
2018/02/02 14:14:42
authorddangdol
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&nbsp; %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. -&nbsp; + %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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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&nbsp;\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-&nbsp;\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
}
2018/02/02 13:41:48
authorddangdol
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&gt;). +%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 &nbsp;%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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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&gt;).\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 &nbsp;%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
}
2018/02/02 13:31:06
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 13:28:15
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 13:24:15
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 13:23:12
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 13:16:15
authorddangdol
body<html> <h1><strong>Model</strong></h1> <p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.</p> <h2>Quick example</h2> <p>아래 예제 모델은&nbsp;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에게 해당 모델들을 알려줘야 한다.&nbsp;<strong>models.py</strong>&nbsp;에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong>&nbsp;에 추가해야 한다.<br> 애플리케이션의 모델이 <strong>myapp.models&nbsp;</strong>(<strong>manage.py startapp</strong>&nbsp;스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong>&nbsp;해당 부분은 아래와 같을 것이다.<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>&nbsp;클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g &lt;input type="text"&gt;, &lt;select&gt;).Django 어드민과 자동으로 생성된 폼의&nbsp;최소(기본적인)&nbsp;유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p> <h3><strong>Field options</strong></h3> <p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어&nbsp;<strong>CharField</strong>&nbsp;(해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong>&nbsp;인수가 필요하다.<br> &nbsp;또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br> <strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong>&nbsp;라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br> <strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다.&nbsp;기본값은 False.<br> <strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong>&nbsp;인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong>&nbsp;인수가 있다면 해당 필드 값은 필수다.<br> <strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br> 모델 인스턴에서 <strong>get_FOO_dispay()</strong>&nbsp;&nbsp;메서드를 사용해서 선택된&nbsp;<strong>choices&nbsp;</strong>필드의 디스플레이 값에&nbsp;접근할 수 있다.<br> <strong>default</strong>필드의 기본값이다. 값 또는 callable&nbsp;&nbsp;객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br> <strong>help_text</strong>폼 위젯과 함께 보이는 추가 "help" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br> <strong>primary_keyTrue&nbsp;</strong>일 경우 이 필드는 모델의 primary key 가 된다.<br> 모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong>&nbsp;설정이 필요 없다.<br> primary key 필드는 읽기 전용이다.&nbsp;The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br> <strong>uniqueTrue</strong>&nbsp;일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</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를&nbsp;&nbsp;설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br> 각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p> <h3><strong>Verbose field names</strong></h3> <p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>,&nbsp;<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>&nbsp;키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서&nbsp;첫 문자를 자동으로 대문자로&nbsp;&nbsp;표시해준다.</p> <h3><strong>Relationships</strong></h3> <p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one,&nbsp;many-to-many and one-to-one) 관계에 대해&nbsp;&nbsp;정의하는 방법을 제공한다.<br> <strong>Many-to-one relationships</strong><br> 다대일 관계 정의는&nbsp;<strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Car</strong>&nbsp;모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong>&nbsp;만을 갖는 경우&nbsp;- 다음 정의를 사용한다.<br> 또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br> ForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p> <h3><strong>Many-to-manu relatioships</strong></h3> <p>다대다 관계 정의는&nbsp;<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>&nbsp;인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이&nbsp;더 자연스럽기 때문이다.<br> 위 설정대로 <strong>Pizza</strong>&nbsp;폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br> 단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을&nbsp;다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다.&nbsp;하지만 때로는 두 모델 간의 관계와&nbsp;데이터가 추가로&nbsp;필요할 수도 있다.<br> 예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br> Django는 이러한 상황에서&nbsp;&nbsp;다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는&nbsp;<strong>through</strong>&nbsp;인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다.&nbsp;중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br> 중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는&nbsp;원본 모델에 대한&nbsp;외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개&nbsp;모델을 통해 다대다 관계를&nbsp;&nbsp;가지고 있는&nbsp;모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른&nbsp;측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여&nbsp;자신의 모델로부터 다대다 관계를&nbsp;&nbsp;정의할 때는 symmetrical=False를 사용해야 한다.&nbsp;이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여&nbsp;관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong>&nbsp;간의 관계를 만들 수 없다. <strong>Membership</strong>&nbsp;모델 관계에 필요한&nbsp;모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong>&nbsp;및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br> 비슷한 이유로 <strong>remove()</strong>&nbsp;메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이&nbsp;다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong>&nbsp;모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong>&nbsp;객체에서 다대다 reverse relationship를&nbsp;쿼리 하는 것이다.<strong>One-to-one relationships</strong><br> 일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br> 객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br> <strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br> 예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 "places"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에&nbsp;<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>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면&nbsp;모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p> <h3><strong>Field name restrictions</strong></h3> <p>Django는 모델 필드 이름에 두 가지를 제한한다.<br> 파이썬 &nbsp;예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br> 필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br> Django는 모든 쿼리에&nbsp;데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <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>) 등등처럼&nbsp;"필드가 아닌 모든 것이다". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</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>사용자 정의할&nbsp;&nbsp;데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong>&nbsp;동작 변경을 원하는 경우가 많다.<br> 동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br> 내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br> 또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당&nbsp;인수들을 지원하는 것을 보장받는다.<br> <strong>Overridden model methods are not called on bulk operations</strong><br> <strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의&nbsp;delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong>&nbsp;signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p> <h3><strong>Executing custom SQL</strong></h3> <p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에&nbsp;사용자 정의 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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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>아래 예제 모델은&nbsp;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에게 해당 모델들을 알려줘야 한다.&nbsp;<strong>models.py</strong>&nbsp;에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong>&nbsp;에 추가해야 한다.<br>\n애플리케이션의 모델이 <strong>myapp.models&nbsp;</strong>(<strong>manage.py startapp</strong>&nbsp;스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong>&nbsp;해당 부분은 아래와 같을 것이다.<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>&nbsp;클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g &lt;input type=\"text\"&gt;, &lt;select&gt;).Django 어드민과 자동으로 생성된 폼의&nbsp;최소(기본적인)&nbsp;유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p>\n<h3><strong>Field options</strong></h3>\n<p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어&nbsp;<strong>CharField</strong>&nbsp;(해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong>&nbsp;인수가 필요하다.<br>\n&nbsp;또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br>\n<strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong>&nbsp;라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br>\n<strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다.&nbsp;기본값은 False.<br>\n<strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong>&nbsp;인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong>&nbsp;인수가 있다면 해당 필드 값은 필수다.<br>\n<strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br>\n모델 인스턴에서 <strong>get_FOO_dispay()</strong>&nbsp;&nbsp;메서드를 사용해서 선택된&nbsp;<strong>choices&nbsp;</strong>필드의 디스플레이 값에&nbsp;접근할 수 있다.<br>\n<strong>default</strong>필드의 기본값이다. 값 또는 callable&nbsp;&nbsp;객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br>\n<strong>help_text</strong>폼 위젯과 함께 보이는 추가 \"help\" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br>\n<strong>primary_keyTrue&nbsp;</strong>일 경우 이 필드는 모델의 primary key 가 된다.<br>\n모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong>&nbsp;설정이 필요 없다.<br>\nprimary key 필드는 읽기 전용이다.&nbsp;The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br>\n<strong>uniqueTrue</strong>&nbsp;일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</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를&nbsp;&nbsp;설정했다고 판단하면, 자동으로 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>,&nbsp;<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>&nbsp;키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서&nbsp;첫 문자를 자동으로 대문자로&nbsp;&nbsp;표시해준다.</p>\n<h3><strong>Relationships</strong></h3>\n<p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one,&nbsp;many-to-many and one-to-one) 관계에 대해&nbsp;&nbsp;정의하는 방법을 제공한다.<br>\n<strong>Many-to-one relationships</strong><br>\n다대일 관계 정의는&nbsp;<strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Car</strong>&nbsp;모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong>&nbsp;만을 갖는 경우&nbsp;- 다음 정의를 사용한다.<br>\n또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br>\nForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p>\n<h3><strong>Many-to-manu relatioships</strong></h3>\n<p>다대다 관계 정의는&nbsp;<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>&nbsp;인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이&nbsp;더 자연스럽기 때문이다.<br>\n위 설정대로 <strong>Pizza</strong>&nbsp;폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br>\n단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을&nbsp;다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다.&nbsp;하지만 때로는 두 모델 간의 관계와&nbsp;데이터가 추가로&nbsp;필요할 수도 있다.<br>\n예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br>\nDjango는 이러한 상황에서&nbsp;&nbsp;다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는&nbsp;<strong>through</strong>&nbsp;인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다.&nbsp;중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br>\n중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는&nbsp;원본 모델에 대한&nbsp;외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개&nbsp;모델을 통해 다대다 관계를&nbsp;&nbsp;가지고 있는&nbsp;모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른&nbsp;측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여&nbsp;자신의 모델로부터 다대다 관계를&nbsp;&nbsp;정의할 때는 symmetrical=False를 사용해야 한다.&nbsp;이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여&nbsp;관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong>&nbsp;간의 관계를 만들 수 없다. <strong>Membership</strong>&nbsp;모델 관계에 필요한&nbsp;모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong>&nbsp;및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br>\n비슷한 이유로 <strong>remove()</strong>&nbsp;메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이&nbsp;다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong>&nbsp;모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong>&nbsp;객체에서 다대다 reverse relationship를&nbsp;쿼리 하는 것이다.<strong>One-to-one relationships</strong><br>\n일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br>\n객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br>\n<strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br>\n예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 \"places\"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에&nbsp;<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>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면&nbsp;모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p>\n<h3><strong>Field name restrictions</strong></h3>\n<p>Django는 모델 필드 이름에 두 가지를 제한한다.<br>\n파이썬 &nbsp;예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br>\n필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br>\nDjango는 모든 쿼리에&nbsp;데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <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>) 등등처럼&nbsp;\"필드가 아닌 모든 것이다\". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</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>사용자 정의할&nbsp;&nbsp;데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong>&nbsp;동작 변경을 원하는 경우가 많다.<br>\n동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br>\n내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br>\n또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당&nbsp;인수들을 지원하는 것을 보장받는다.<br>\n<strong>Overridden model methods are not called on bulk operations</strong><br>\n<strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의&nbsp;delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong>&nbsp;signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p>\n<h3><strong>Executing custom SQL</strong></h3>\n<p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에&nbsp;사용자 정의 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
}
2018/02/02 13:15:18
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 13:14:24
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 13:13:54
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 13:13:18
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
authorddangdol
body사진올리기 엄청 헤맸었는데 감사합니다. 궁금한게 있는데 로컬이미지 업로드는 불가능하고 외부 이미지링크만 허용되는건가요?? 뉴비라서 ㅜㅜ 헷갈리네요!!
json metadata{"tags":["kr"],"app":"steemit/0.1"}
parent authorgamwoosonge
parent permlink5iad3-a-to-z
permlinkre-gamwoosonge-5iad3-a-to-z-20180202t131056782z
title
Transaction InfoBlock #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
}
2018/02/02 13:08:18
authorddangdol
body<html> <h1><strong>Model</strong></h1> <p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.</p> <h2>Quick example</h2> <p>아래 예제 모델은&nbsp;first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br> 위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p> <p><br></p> <h2>Using models</h2> <p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다.&nbsp;<strong>models.py</strong>&nbsp;에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong>&nbsp;에 추가해야 한다.<br> 애플리케이션의 모델이 <strong>myapp.models&nbsp;</strong>(<strong>manage.py startapp</strong>&nbsp;스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong>&nbsp;해당 부분은 아래와 같을 것이다.<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>&nbsp;클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g &lt;input type="text"&gt;, &lt;select&gt;).Django 어드민과 자동으로 생성된 폼의&nbsp;최소(기본적인)&nbsp;유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p> <h3><strong>Field options</strong></h3> <p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어&nbsp;<strong>CharField</strong>&nbsp;(해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong>&nbsp;인수가 필요하다.<br> &nbsp;또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br> <strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong>&nbsp;라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br> <strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다.&nbsp;기본값은 False.<br> <strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong>&nbsp;인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong>&nbsp;인수가 있다면 해당 필드 값은 필수다.<br> <strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br> 모델 인스턴에서 <strong>get_FOO_dispay()</strong>&nbsp;&nbsp;메서드를 사용해서 선택된&nbsp;<strong>choices&nbsp;</strong>필드의 디스플레이 값에&nbsp;접근할 수 있다.<br> <strong>default</strong>필드의 기본값이다. 값 또는 callable&nbsp;&nbsp;객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br> <strong>help_text</strong>폼 위젯과 함께 보이는 추가 "help" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br> <strong>primary_keyTrue&nbsp;</strong>일 경우 이 필드는 모델의 primary key 가 된다.<br> 모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong>&nbsp;설정이 필요 없다.<br> primary key 필드는 읽기 전용이다.&nbsp;The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br> <strong>uniqueTrue</strong>&nbsp;일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</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를&nbsp;&nbsp;설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br> 각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p> <h3><strong>Verbose field names</strong></h3> <p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>,&nbsp;<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>&nbsp;키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서&nbsp;첫 문자를 자동으로 대문자로&nbsp;&nbsp;표시해준다.</p> <h3><strong>Relationships</strong></h3> <p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one,&nbsp;many-to-many and one-to-one) 관계에 대해&nbsp;&nbsp;정의하는 방법을 제공한다.<br> <strong>Many-to-one relationships</strong><br> 다대일 관계 정의는&nbsp;<strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Car</strong>&nbsp;모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong>&nbsp;만을 갖는 경우&nbsp;- 다음 정의를 사용한다.<br> 또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br> ForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p> <h3><strong>Many-to-manu relatioships</strong></h3> <p>다대다 관계 정의는&nbsp;<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>&nbsp;인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이&nbsp;더 자연스럽기 때문이다.<br> 위 설정대로 <strong>Pizza</strong>&nbsp;폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br> 단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을&nbsp;다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다.&nbsp;하지만 때로는 두 모델 간의 관계와&nbsp;데이터가 추가로&nbsp;필요할 수도 있다.<br> 예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br> Django는 이러한 상황에서&nbsp;&nbsp;다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는&nbsp;<strong>through</strong>&nbsp;인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다.&nbsp;중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br> 중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는&nbsp;원본 모델에 대한&nbsp;외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개&nbsp;모델을 통해 다대다 관계를&nbsp;&nbsp;가지고 있는&nbsp;모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른&nbsp;측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여&nbsp;자신의 모델로부터 다대다 관계를&nbsp;&nbsp;정의할 때는 symmetrical=False를 사용해야 한다.&nbsp;이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여&nbsp;관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong>&nbsp;간의 관계를 만들 수 없다. <strong>Membership</strong>&nbsp;모델 관계에 필요한&nbsp;모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong>&nbsp;및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br> 비슷한 이유로 <strong>remove()</strong>&nbsp;메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이&nbsp;다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong>&nbsp;모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong>&nbsp;객체에서 다대다 reverse relationship를&nbsp;쿼리 하는 것이다.<strong>One-to-one relationships</strong><br> 일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br> 객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br> <strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br> 예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 "places"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에&nbsp;<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>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면&nbsp;모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p> <h3><strong>Field name restrictions</strong></h3> <p>Django는 모델 필드 이름에 두 가지를 제한한다.<br> 파이썬 &nbsp;예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br> 필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br> Django는 모든 쿼리에&nbsp;데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <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>) 등등처럼&nbsp;"필드가 아닌 모든 것이다". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</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>사용자 정의할&nbsp;&nbsp;데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong>&nbsp;동작 변경을 원하는 경우가 많다.<br> 동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br> 내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br> 또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당&nbsp;인수들을 지원하는 것을 보장받는다.<br> <strong>Overridden model methods are not called on bulk operations</strong><br> <strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의&nbsp;delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong>&nbsp;signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p> <h3><strong>Executing custom SQL</strong></h3> <p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에&nbsp;사용자 정의 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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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>아래 예제 모델은&nbsp;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에게 해당 모델들을 알려줘야 한다.&nbsp;<strong>models.py</strong>&nbsp;에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong>&nbsp;에 추가해야 한다.<br>\n애플리케이션의 모델이 <strong>myapp.models&nbsp;</strong>(<strong>manage.py startapp</strong>&nbsp;스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong>&nbsp;해당 부분은 아래와 같을 것이다.<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>&nbsp;클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g &lt;input type=\"text\"&gt;, &lt;select&gt;).Django 어드민과 자동으로 생성된 폼의&nbsp;최소(기본적인)&nbsp;유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p>\n<h3><strong>Field options</strong></h3>\n<p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어&nbsp;<strong>CharField</strong>&nbsp;(해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong>&nbsp;인수가 필요하다.<br>\n&nbsp;또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br>\n<strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong>&nbsp;라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br>\n<strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다.&nbsp;기본값은 False.<br>\n<strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong>&nbsp;인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong>&nbsp;인수가 있다면 해당 필드 값은 필수다.<br>\n<strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br>\n모델 인스턴에서 <strong>get_FOO_dispay()</strong>&nbsp;&nbsp;메서드를 사용해서 선택된&nbsp;<strong>choices&nbsp;</strong>필드의 디스플레이 값에&nbsp;접근할 수 있다.<br>\n<strong>default</strong>필드의 기본값이다. 값 또는 callable&nbsp;&nbsp;객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br>\n<strong>help_text</strong>폼 위젯과 함께 보이는 추가 \"help\" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br>\n<strong>primary_keyTrue&nbsp;</strong>일 경우 이 필드는 모델의 primary key 가 된다.<br>\n모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong>&nbsp;설정이 필요 없다.<br>\nprimary key 필드는 읽기 전용이다.&nbsp;The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br>\n<strong>uniqueTrue</strong>&nbsp;일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</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를&nbsp;&nbsp;설정했다고 판단하면, 자동으로 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>,&nbsp;<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>&nbsp;키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서&nbsp;첫 문자를 자동으로 대문자로&nbsp;&nbsp;표시해준다.</p>\n<h3><strong>Relationships</strong></h3>\n<p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one,&nbsp;many-to-many and one-to-one) 관계에 대해&nbsp;&nbsp;정의하는 방법을 제공한다.<br>\n<strong>Many-to-one relationships</strong><br>\n다대일 관계 정의는&nbsp;<strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Car</strong>&nbsp;모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong>&nbsp;만을 갖는 경우&nbsp;- 다음 정의를 사용한다.<br>\n또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br>\nForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p>\n<h3><strong>Many-to-manu relatioships</strong></h3>\n<p>다대다 관계 정의는&nbsp;<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>&nbsp;인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이&nbsp;더 자연스럽기 때문이다.<br>\n위 설정대로 <strong>Pizza</strong>&nbsp;폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br>\n단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을&nbsp;다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다.&nbsp;하지만 때로는 두 모델 간의 관계와&nbsp;데이터가 추가로&nbsp;필요할 수도 있다.<br>\n예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br>\nDjango는 이러한 상황에서&nbsp;&nbsp;다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는&nbsp;<strong>through</strong>&nbsp;인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다.&nbsp;중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br>\n중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는&nbsp;원본 모델에 대한&nbsp;외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개&nbsp;모델을 통해 다대다 관계를&nbsp;&nbsp;가지고 있는&nbsp;모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른&nbsp;측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여&nbsp;자신의 모델로부터 다대다 관계를&nbsp;&nbsp;정의할 때는 symmetrical=False를 사용해야 한다.&nbsp;이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여&nbsp;관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong>&nbsp;간의 관계를 만들 수 없다. <strong>Membership</strong>&nbsp;모델 관계에 필요한&nbsp;모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong>&nbsp;및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br>\n비슷한 이유로 <strong>remove()</strong>&nbsp;메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이&nbsp;다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong>&nbsp;모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong>&nbsp;객체에서 다대다 reverse relationship를&nbsp;쿼리 하는 것이다.<strong>One-to-one relationships</strong><br>\n일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br>\n객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br>\n<strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br>\n예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 \"places\"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에&nbsp;<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>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면&nbsp;모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p>\n<h3><strong>Field name restrictions</strong></h3>\n<p>Django는 모델 필드 이름에 두 가지를 제한한다.<br>\n파이썬 &nbsp;예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br>\n필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br>\nDjango는 모든 쿼리에&nbsp;데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <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>) 등등처럼&nbsp;\"필드가 아닌 모든 것이다\". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</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>사용자 정의할&nbsp;&nbsp;데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong>&nbsp;동작 변경을 원하는 경우가 많다.<br>\n동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br>\n내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br>\n또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당&nbsp;인수들을 지원하는 것을 보장받는다.<br>\n<strong>Overridden model methods are not called on bulk operations</strong><br>\n<strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의&nbsp;delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong>&nbsp;signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p>\n<h3><strong>Executing custom SQL</strong></h3>\n<p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에&nbsp;사용자 정의 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
}
2018/02/02 09:27:33
authorddangdol
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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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
}
2018/02/02 09:24:12
authorddangdol
body<html> <pre><code><strong>Models</strong></code></pre> <p>모델은 데이터 정보를 정의한 소스다. 저장 중인 데이터의 필수 필드와 동작들이 포함되어있다. 일반적으로 모델은 데이터베이스 테이블과 매핑된다.<br> </p> <h2>Quick example</h2> <p>아래 예제 모델은&nbsp;first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br> 위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p> <h2>Using models</h2> <p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다.&nbsp;<strong>models.py</strong>&nbsp;에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong>&nbsp;에 추가해야 한다.<br> 애플리케이션의 모델이 <strong>myapp.models&nbsp;</strong>(<strong>manage.py startapp</strong>&nbsp;스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong>&nbsp;해당 부분은 아래와 같을 것이다.<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>&nbsp;클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g &lt;input type="text"&gt;, &lt;select&gt;).Django 어드민과 자동으로 생성된 폼의&nbsp;최소(기본적인)&nbsp;유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p> <h3><strong>Field options</strong></h3> <p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어&nbsp;<strong>CharField</strong>&nbsp;(해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong>&nbsp;인수가 필요하다.<br> &nbsp;또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br> <strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong>&nbsp;라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br> <strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다.&nbsp;기본값은 False.<br> <strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong>&nbsp;인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong>&nbsp;인수가 있다면 해당 필드 값은 필수다.<br> <strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br> 모델 인스턴에서 <strong>get_FOO_dispay()</strong>&nbsp;&nbsp;메서드를 사용해서 선택된&nbsp;<strong>choices&nbsp;</strong>필드의 디스플레이 값에&nbsp;접근할 수 있다.<br> <strong>default</strong>필드의 기본값이다. 값 또는 callable&nbsp;&nbsp;객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br> <strong>help_text</strong>폼 위젯과 함께 보이는 추가 "help" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br> <strong>primary_keyTrue&nbsp;</strong>일 경우 이 필드는 모델의 primary key 가 된다.<br> 모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong>&nbsp;설정이 필요 없다.<br> primary key 필드는 읽기 전용이다.&nbsp;The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br> <strong>uniqueTrue</strong>&nbsp;일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</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를&nbsp;&nbsp;설정했다고 판단하면, 자동으로 id 컬럼을 추가하지 않는다.<br> 각 모델은 <strong>primary_key=True</strong>(사용자가 지정 또는 자동으로 추가된)를 가진 정확히 하나의 필드만 요구한다.</p> <h3><strong>Verbose field names</strong></h3> <p><strong>ForeignKey</strong>, <strong>ManyToManyField</strong>,&nbsp;<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>&nbsp;키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서&nbsp;첫 문자를 자동으로 대문자로&nbsp;&nbsp;표시해준다.</p> <h3><strong>Relationships</strong></h3> <p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one,&nbsp;many-to-many and one-to-one) 관계에 대해&nbsp;&nbsp;정의하는 방법을 제공한다.<br> <strong>Many-to-one relationships</strong><br> 다대일 관계 정의는&nbsp;<strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br> <strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br> 예를 들면, <strong>Car</strong>&nbsp;모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong>&nbsp;만을 갖는 경우&nbsp;- 다음 정의를 사용한다.<br> 또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br> ForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p> <h3><strong>Many-to-manu relatioships</strong></h3> <p>다대다 관계 정의는&nbsp;<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>&nbsp;인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이&nbsp;더 자연스럽기 때문이다.<br> 위 설정대로 <strong>Pizza</strong>&nbsp;폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br> 단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을&nbsp;다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다.&nbsp;하지만 때로는 두 모델 간의 관계와&nbsp;데이터가 추가로&nbsp;필요할 수도 있다.<br> 예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br> Django는 이러한 상황에서&nbsp;&nbsp;다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는&nbsp;<strong>through</strong>&nbsp;인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다.&nbsp;중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br> 중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는&nbsp;원본 모델에 대한&nbsp;외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개&nbsp;모델을 통해 다대다 관계를&nbsp;&nbsp;가지고 있는&nbsp;모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른&nbsp;측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여&nbsp;자신의 모델로부터 다대다 관계를&nbsp;&nbsp;정의할 때는 symmetrical=False를 사용해야 한다.&nbsp;이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여&nbsp;관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong>&nbsp;간의 관계를 만들 수 없다. <strong>Membership</strong>&nbsp;모델 관계에 필요한&nbsp;모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong>&nbsp;및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br> 비슷한 이유로 <strong>remove()</strong>&nbsp;메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이&nbsp;다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong>&nbsp;모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong>&nbsp;객체에서 다대다 reverse relationship를&nbsp;쿼리 하는 것이다.<strong>One-to-one relationships</strong><br> 일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br> 객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br> <strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br> 예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 "places"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에&nbsp;<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>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면&nbsp;모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p> <h3><strong>Field name restrictions</strong></h3> <p>Django는 모델 필드 이름에 두 가지를 제한한다.<br> 파이썬 &nbsp;예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br> 필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br> Django는 모든 쿼리에&nbsp;데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <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>) 등등처럼&nbsp;"필드가 아닌 모든 것이다". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</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>사용자 정의할&nbsp;&nbsp;데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong>&nbsp;동작 변경을 원하는 경우가 많다.<br> 동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br> 내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br> 또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당&nbsp;인수들을 지원하는 것을 보장받는다.<br> <strong>Overridden model methods are not called on bulk operations</strong><br> <strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의&nbsp;delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong>&nbsp;signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p> <h3><strong>Executing custom SQL</strong></h3> <p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에&nbsp;사용자 정의 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 permlinkdjango
permlinkdjango-models-introduction-to-models
titleDjango Models - Introduction to models
Transaction InfoBlock #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>아래 예제 모델은&nbsp;first_name과 last_name을 가진 Person을 정의한다.first_name과 last_name은 모델의 필드다. 각 필드는 클래스 속성으지정되어있고 각 속성은 데이터베이스 컬럼과 매핑된다.<br>\n위 Person 모델은 아래와 같은 데이터베이스 테이블을 만든다.</p>\n<h2>Using models</h2>\n<p>모델을 정의했다면 Django에게 해당 모델들을 알려줘야 한다.&nbsp;<strong>models.py</strong>&nbsp;에 포함된 모듈의 이름을 세팅 파일에 <strong>INSTALLED_APPS</strong>&nbsp;에 추가해야 한다.<br>\n애플리케이션의 모델이 <strong>myapp.models&nbsp;</strong>(<strong>manage.py startapp</strong>&nbsp;스크립트를 통해 작성된 애플리케이션 패키지 구조) 모듈에 있을 경우 <strong>INSTALLED_APPS</strong>&nbsp;해당 부분은 아래와 같을 것이다.<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>&nbsp;클래스의 인스턴스여야 한다. Django는 필드 클래스 타입을 사용하여 몇 가지를 결정한다.데이터베이스에 저장할 데이터의 종류에 따른 컬럼 타입 (e.g INTEGER, VARCHAR, TEXT).폼 필드를 렌더링 할 때 사용하기 위한 기본 HTML 위젯 (e.g &lt;input type=\"text\"&gt;, &lt;select&gt;).Django 어드민과 자동으로 생성된 폼의&nbsp;최소(기본적인)&nbsp;유효성 검사Django에는 많은 빌트인 필드 타입이 있다. 모델 필드 참조 목록에서 확인할 수 있다.</p>\n<h3><strong>Field options</strong></h3>\n<p>각 필드는 특정 필드 관련 인수들이 있다. 예를 들어&nbsp;<strong>CharField</strong>&nbsp;(해당 하위 클래스 포함)는 데이터를 저장할 때 VARCHAR 데이터베이스 필드의 크기를 지정하는 <strong>max_length</strong>&nbsp;인수가 필요하다.<br>\n&nbsp;또한 모든 필드 타입에서 사용 가능한 일반적인 인수들이 있다. 모두 선택 인수들이다. 모델 필드 참조 문서에 모두 설명되어있지만 아래에 자주 쓰이는 것들을 요약한다.<br>\n<strong>null</strong>If True, Django will store empty values as NULL in the database. Default is False.<strong>True</strong>&nbsp;라면 Dajngo는 데이터베이스에 빈 값을 NULL로 저장한다. 기본값은 <strong>False</strong>.<br>\n<strong>blank</strong>True 라면 해당 필드는 비워둘 수 있다.&nbsp;기본값은 False.<br>\n<strong>null</strong>과는 다르다. <strong>null</strong>은 순전히 데이터베이스와 관련되어있는 반면 <strong>blank</strong>는 유효성 검사와 관련되어있다. 필드에 <strong>blank=True</strong>&nbsp;인수가 있다면 폼 유효성 검사 시 빈 값을 허용한다. 필드에 <strong>blank=False</strong>&nbsp;인수가 있다면 해당 필드 값은 필수다.<br>\n<strong>choices</strong>필드의 선택지로 2-tuples 의 iterable을 사용한다. choice 속성이 주어지면 기본 폼 위젯은 표준 텍스트 필드 대신 셀렉트 박스가 되고 선택항목이 해당 iterble로 제한된다.각 tuple의 첫 번째 요소는 데이터베이스에 저장될 값이다. 두 번째 요소는 필드의 폼 위젯에 보인다.<br>\n모델 인스턴에서 <strong>get_FOO_dispay()</strong>&nbsp;&nbsp;메서드를 사용해서 선택된&nbsp;<strong>choices&nbsp;</strong>필드의 디스플레이 값에&nbsp;접근할 수 있다.<br>\n<strong>default</strong>필드의 기본값이다. 값 또는 callable&nbsp;&nbsp;객체일 수 있다. callable 일 경우 새로운 객체가 생성될 때마다 호출된다.<br>\n<strong>help_text</strong>폼 위젯과 함께 보이는 추가 \"help\" 텍스트다. 필드가 폼에 사용되지 않더라도 문서화 시 유용하다.<br>\n<strong>primary_keyTrue&nbsp;</strong>일 경우 이 필드는 모델의 primary key 가 된다.<br>\n모델에 어떤 필드에도 <strong>primary_key=True</strong>를 지정하지 않는다면, Django는 자동으로 기본키를 보유할 IntegerField를 추가하므로, 기본 primary-key 동작을 재정하는 경우를 제외하면 <strong>primary_key=True</strong>&nbsp;설정이 필요 없다.<br>\nprimary key 필드는 읽기 전용이다.&nbsp;The primary key field is read-only. 기존 객체에 primary key값을 변경하고 저장하면, 이전 객체가 유지되고 새로운 객체가 생성된다.<br>\n<strong>uniqueTrue</strong>&nbsp;일 경우, 이 필드는 테이블을 통틀어서 유일해야만 한다.</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를&nbsp;&nbsp;설정했다고 판단하면, 자동으로 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>,&nbsp;<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>&nbsp;키워드 인수를 사용한다.컨변센은 verbose_name에 첫 문자를 대문자로 사용하지 않습니다. DJango가 필요한 곳에서&nbsp;첫 문자를 자동으로 대문자로&nbsp;&nbsp;표시해준다.</p>\n<h3><strong>Relationships</strong></h3>\n<p>명백히, 관계형 데이터베이스의 힘은 테이블이 서로 관계를 맺는 데 있다. Django는 가장 일반적인 세 가지(many-to-one,&nbsp;many-to-many and one-to-one) 관계에 대해&nbsp;&nbsp;정의하는 방법을 제공한다.<br>\n<strong>Many-to-one relationships</strong><br>\n다대일 관계 정의는&nbsp;<strong>django.db.models.ForeignKey</strong>를 사용한다. 다른 필드 타입과 같이 모델에 클래스 속성으로 포함하여 사용한다.<br>\n<strong>ForeignKey</strong>는 위치 인수가 필요하다. 모델이 인수에 관련된 클래스다.<br>\n예를 들면, <strong>Car</strong>&nbsp;모델이 <strong>Manufacturer</strong>를 가지고 있다면 - 즉, <strong>Manufacturer</strong>는 여러 개의 <strong>Car</strong>를 만들지만 <strong>Car</strong>는 하나의 <strong>Manufacturer</strong>&nbsp;만을 갖는 경우&nbsp;- 다음 정의를 사용한다.<br>\n또한 재귀 관계와 아직 정의되지 않은 모델과의 관계를 만들 수 있다.<br>\nForeignKey 필드(위 예제에서 manufacturer)의 이름을 모델 이름의 소문자로 권장하지만 필수는 아니다. 물론 원하는 데로 필드를 호출할 수 있다.</p>\n<h3><strong>Many-to-manu relatioships</strong></h3>\n<p>다대다 관계 정의는&nbsp;<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>&nbsp;인스턴스는 폼에서 편집될 객체에 있어야 한다. 위 예제에서, <strong>toppings</strong>가 <strong>Pizza</strong>에 있다. 피자에 토핑이 있다고 생각하는 것이 토핑이 여러 개의 피자에 올라가는 것이&nbsp;더 자연스럽기 때문이다.<br>\n위 설정대로 <strong>Pizza</strong>&nbsp;폼을 사용하면 사용자들이 토핑을 선택하게 될 것이다.<strong>Extra fields on many-to-many relationships</strong><br>\n단지 피자와 토핑을 혼합하고 매치하는 단순한 다대다 관계만을&nbsp;다룰 때는, 표준 <strong>ManyToManyField</strong>만 있으면 된다.&nbsp;하지만 때로는 두 모델 간의 관계와&nbsp;데이터가 추가로&nbsp;필요할 수도 있다.<br>\n예를 들어, 뮤지션이 소속된 뮤지컬 그룹을 추적하는 애플리케이션의 상황을 생각해보자. 사람과 멤버들이 있는 그룹 간에는 다대다 관계가 있다. 그러므로 이 관계를 표현하는데 <strong>ManyToManyField</strong>를 사용할 수 있다. 하지만 그룹에 가입한 날짜와 같이 회원에 대해 수집하길 원하는 많은 상세정보가 있다.<br>\nDjango는 이러한 상황에서&nbsp;&nbsp;다대다 관계를 관리하는 데 사용될 모델을 지정할 수 있다. 그러고 나서 중간 모델에 추가 필드를 입력할 수 있다. 중간 모델은 중개인 역할을 하는 모델을 가리키는&nbsp;<strong>through</strong>&nbsp;인수를 사용해서 <strong>ManyToManyField</strong>와 연결된다. 뮤지선 예제 코드는 다음과 같다.&nbsp;중개 모델을 설정할 때, 다대다 관계에 관여하는 모델들을 위한 외래 키를 명시적으로 지정한다. 이 명시적 선언은 두 모델이 관련되는 방식을 정의한다.<br>\n중간 모델에는 몇 가지 제한사항이 있다.중간 모델에는&nbsp;원본 모델에 대한&nbsp;외래 키가 하나만 포함되야한다(예제에서 Group). 또는 Django에서 ManyToManyField.through_fields를 사용해서 관계에 사용해야 하는 외래 키를 명시적으로 지정해야 한다. 두 개 이상의 외래 키가 있고 through_fields를 정의하지 않는다면, 유효성 검증 오류가 발생한다. 외래 키에 대한 비슷한 제한사항이 대상 모델(예제에서 Person)에도 적용된다.중개&nbsp;모델을 통해 다대다 관계를&nbsp;&nbsp;가지고 있는&nbsp;모델의 경우 동일한 모델에 대한 두 개의 외래 키가 허용되지만 다대다 관계와는 다른&nbsp;측면으로 처리된다. 두 개 이상의 외래 키가 있는 경우, 위처럼 through_fields를 지정해야 한다. 그렇지 않으면 유효성 검증 에러가 발생한다.중개 모델을 사용하여&nbsp;자신의 모델로부터 다대다 관계를&nbsp;&nbsp;정의할 때는 symmetrical=False를 사용해야 한다.&nbsp;이제 중개 모델(예제에서 <strong>Membership</strong>)을 사용하여 ManyToManyField를 설정했으므로 다대다 관계를 만들 준비가 되었다. 중간 모델의 인스턴스를 만들어 실행한다.일반적인 다대다 필드와는 다르게 <strong>add()</strong>, <strong>create()</strong>, <strong>set()</strong>을 사용하여&nbsp;관계를 만들 수 없다.왜일까? <strong>Person</strong>과 <strong>Group</strong>&nbsp;간의 관계를 만들 수 없다. <strong>Membership</strong>&nbsp;모델 관계에 필요한&nbsp;모든 세부 정보를 지정해야 한다. 간단한 <strong>add</strong>, <strong>create</strong>&nbsp;및 할당 호출은 추가 세부사항을 지정하는 방법을 제공하지 않는다. 결과적으로 중간 모델을 사용한 다대다 관계에서는 비활성화된다. 이런 관계의 유형을 생성하기 위한 유일한 방법은 중간 모델의 인스턴스를 생성하는 것이다.<br>\n비슷한 이유로 <strong>remove()</strong>&nbsp;메서드가 비활성화된다. 예를 들면, 중간 모델에 의해 정의된 사용자 정의 테이블을 통해 (model1, model2)의 유일성이 적용되지 않은 경우 remove() 호출은 지워야 할 중간 모델 인스턴스에 대한 충분한 정보를 제공하지 않는다.하지만, clear() 메서드를 사용하여 모든 인스턴스에 다대다 관계를 삭제할 수 있다.중간 모델의 인스턴스를 생성하여 다대다 관계를 설정하면 쿼리를 실행할 수 있다. 일반적인 다대다 관계같이&nbsp;다대다 관계 모델의 속성을 사용하여 쿼리 할 수 있다.중간 모델을 사용할 때 해당 속성에 대해서도 쿼리 할 수 있다.회원의 정보에 접근이 필요할 경우 직접 <strong>Membership</strong>&nbsp;모델에 쿼리 하여 수행할 수 있다.같은 정보에 접근하는 다른 방법은 <strong>Person</strong>&nbsp;객체에서 다대다 reverse relationship를&nbsp;쿼리 하는 것이다.<strong>One-to-one relationships</strong><br>\n일대일 관계는 <strong>OneToOneField</strong>를 사용해 정의한다. 다른 필드 타입과 같이 모델의 클래스 속성을 포함하여 사용한다.<br>\n객체를 어떤 방법으로 다른 객체로 확장할 때 매우 유용하다.<br>\n<strong>OneToOneField</strong>에는 위치 인수가 필요하다. 모델이 관련 클래스이다.<br>\n예를 들어, 주소, 전화번호, 기타 등등의 속성이 포함된 \"places\"의 데이터베이스를 구축한 후 장소위에 레스토랑의 데이터베이스를 구축하길 원한다면 해당 장소의 정보를 복사해서 새로운 레스토랑 데이터베이스를 구축하는 대신에 <strong>Restaurant</strong>에&nbsp;<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>모델을 다른 앱의 모델과 관계하는 것도 가능하다. 이것을 하려면&nbsp;모델이 정의된 파일의 맨 위에 관련된 모델을 import 한다. 그다음 필요한 곳에 다른 모델 클래스를 참조해라.</p>\n<h3><strong>Field name restrictions</strong></h3>\n<p>Django는 모델 필드 이름에 두 가지를 제한한다.<br>\n파이썬 &nbsp;예약어는 파이썬 구문 오류가 발생하기 때문에 필드 이름이 될 수 없다.필드 이름은 한 행에 두 개 이상의 밑줄이 포함할 수 없다. Django의 쿼리 조회 구문의 동작 방법 같은 두 개의 밑줄은 포함될 수 없다.<br>\n필드 이름이 데이터베이스 컬럼 이름과 일치할 필요는 없기 때문에 이러한 제한사항은 해결될 수 있다.<br>\nDjango는 모든 쿼리에&nbsp;데이터베이스 테이블 이름과 컬럼 이름을 이스케이프 처리하기 때문에 모델 필드 이름으로 <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>) 등등처럼&nbsp;\"필드가 아닌 모든 것이다\". 아무것도 필수가 아니며 모델의 클래스 메타를 추가하는 것은 완전히 선택사항이다.</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>사용자 정의할&nbsp;&nbsp;데이터베이스 동작들을 캡슐화하는 다른 모델 메서드 집합이 있다. 특히 <strong>save()</strong>와 <strong>delete()</strong>&nbsp;동작 변경을 원하는 경우가 많다.<br>\n동작을 변경하기 위해 이 메서드들을 자유롭게 재정의할 수 있다.<br>\n내장 메서드를 재정의하는 고전적인 사용 사례는 객체가 저장될 때마다 무언가를 원하는 경우다.저장하는 것을 막을 수도 있다.객체가 항상 안전하게 저장되는 위해 superclass 메서드를 호출하는 것을 기억하는 것이 중요하다. superclass 메서드 호출하는 것을 잊으면, 기본 동작과 데이터베이스를 손대지 않는다.<br>\n또한 모델 메서드에 전달할 수 있는 인수들을 전달하는 것이 중요하다. - <strong>*args</strong>, <strong>**kwargs</strong>. Django는 수시로 내장 모델 메서드의 기능을 확장하고 새로운 인수를 추가한다. 메서드 정의에서 <strong>*args</strong>, <strong>**kwargs</strong>를 사용한다면 코드가 추가될 때 자동으로 해당&nbsp;인수들을 지원하는 것을 보장받는다.<br>\n<strong>Overridden model methods are not called on bulk operations</strong><br>\n<strong>QuerySet</strong>을 사용해서 대량으로 객체를 삭제하거나 cascading 삭제의 결과로 해당 객체의&nbsp;delete() 메서드가 반드시 호출되지는 않는다. 안전한 사용자 정의 로직을 위해서는 <strong>pre_delete</strong>와 <strong>post_delete</strong>&nbsp;signal을 사용한다. 불행하게도, 객체를 대량으로 만들거나 수정할 때는 <strong>save()</strong>, <strong>pre_save</strong>, <strong>post_save</strong>가 호출되지 않기 때문에 해결방법이 없다.</p>\n<h3><strong>Executing custom SQL</strong></h3>\n<p>또 다른 일반적인 패턴은 모델 메서드와 모듈 수준의 메서드에&nbsp;사용자 정의 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 properties
2018/01/31 02:07:09
accountddangdol
json metadata{"profile":{"name":"Superanddo"}}
memo keySTM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ
Transaction InfoBlock #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
}
steemcreated a new account: @ddangdol
2018/01/31 01:57:03
active{"account_auths":[],"key_auths":[["STM7UiV4bDvVADDi65X8HcZUR7zoT6QwXY2KkstbnTSnGAJ1xVDCb",1]],"weight_threshold":1}
creatorsteem
delegation29700.000000 VESTS
extensions[]
fee0.500 STEEM
json metadata
memo keySTM5ZUWQMbTMXnHL1UfWaex4gp5BZF6s7RMBGEoCyJ4EiKkFewcHZ
new account nameddangdol
owner{"account_auths":[],"key_auths":[["STM6yh4He7Egr3SCGEbK6Lwi1FwGdBwGhzXghx12yHFBGr8k2Kt7k",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM8hdPY8XibM9fC4ymj2XGrYh1cnXqBpb99Js19SWzaSHtFaRd6K",1]],"weight_threshold":1}
Transaction InfoBlock #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
}

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.
[]