Django-rest-framework: рдкреБрдЯ рдХреЙрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рд▓рдХреНрд╖рд┐рдд рд╕рдВрд╕рд╛рдзрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ"

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЬреВрди 2016  ┬╖  68рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: encode/django-rest-framework

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рдорд╕реНрдпрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП, https://github.com/encode/django-rest-framework/issues/4231#issuecomment -332935943 рдкрд░ рдЬрд╛рдПрдВ

===

рдореБрдЭреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DRF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдПрдХ рдСрдкреНрдЯрд┐рдорд┐рд╕реНрдЯрд┐рдХ рдХрдВрд╕реБрд░реЗрдВрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИред рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

  • рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдореИрдВ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдбреАрдЖрд░рдПрдл рдХреЗ рдХрд╛рд░рдг рд╣реИ
  • рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЗрдЪреНрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ
  • рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реИ

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдиреЗ Django рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрд╢рд╛рд╡рд╛рджреА рд╕рдореЗрдХрди рдЬреЛрдбрд╝рд╛ рд╣реИред рдЖрдкрдХреЛ рд╡рд┐рдХреА рд▓реБрдХрдЕрдк рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

  • рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдлрд╝реАрд▓реНрдб рд╣реЛрддрд╛ рд╣реИ
  • рдЬрдм рдХреЛрдИ рд╕рдВрдкрд╛рджрдХ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  • рдЬрдм рд╕рдВрдкрд╛рджрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдорд┐рд▓ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреА рддреБрд▓рдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ
  • рдпрджрд┐ рд╕рдВрд╕реНрдХрд░рдг рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдкрд╛рджрдХ рдиреЗ рдирд╡реАрдирддрдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдФрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдпрджрд┐ рд╕рдВрд╕реНрдХрд░рдг рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдкрд╛рджрдХ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдФрд░ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рд╕рдордп рдХреЗ рдмреАрдЪ рдПрдХ "рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА" рд╕рдВрдкрд╛рджрди рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдВрдкрд╛рджрди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрддреЗ рд╣реИрдВ
  • рдпрджрд┐ рд╕рдВрд╕реНрдХрд░рдг рдЧреБрдо рд╣реИ, рддреЛ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдкрд╛рджрди рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП

рдореЗрд░реЗ рдкрд╛рд╕ рдбреАрдЖрд░рдПрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рдпреВрдЖрдИ рдерд╛ред рд▓реАрдЧреЗрд╕реА UI рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛. рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдпрд╣ рд╕рдорд╡рд░реНрддреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖред рдЕрдЧрд░ рдореИрдВ #3648 рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ:

  • DRF, PUT рдХреЛ рдореМрдЬреВрджрд╛ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрдиреБрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдг рдЖрдИрдбреА рдХреЛ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдИрдбреА рд╕реЗ рднрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ
  • рдЪреВрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рдореИрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдЪрд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдЖрд╢рд╛рд╡рд╛рджреА рд╕рдорд╡рд░реНрддреА рдкреНрд░рдгрд╛рд▓реА рдЯреВрдЯ рдЬрд╛рдПрдЧреА рдЬреЛ рдбреАрдЖрд░рдПрдл рдореЗрдВ рд╕рдВрдЪрд╛рд░ рдХрд░рддреА рд╣реИ
  • ~ рд╣рд░ рдмрд╛рд░ рдбреЗрдЯрд╛ рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ (рдЬреИрд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЛ "рдЖрд╡рд╢реНрдпрдХ") рдмрдирд╛рдирд╛ред ~ (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрдк рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдмрдирд╛рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)

рдкреНрд░рдЬрдирди рдХреЗ рдЪрд░рдг

  1. рдПрдХ рдореЙрдбрд▓ рдкрд░ рдПрдХ рдЖрд╢рд╛рд╡рд╛рджреА рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░реЗрдВ
  2. рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдХрдИ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ (рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ)
  3. рд╕рдВрд╕реНрдХрд░рдг рдЖрдИрдбреА рдХреЛ рдЫреЛрдбрд╝рдХрд░ DRF рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдкрдбреЗрдЯ (PUT) рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВ

    рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

рдЕрдиреБрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдг рдЖрдИрдбреА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рд╕рдорд╡рд░реНрддреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░

рдЧреБрдо рд╕рдВрд╕реНрдХрд░рдг рдЖрдИрдбреА рдХреЛ рдбреАрдЖрд░рдПрдл рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдЖрдИрдбреА рд╕реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдорд╡рд░реНрддреА рдЬрд╛рдВрдЪ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рдПред

рд╕рднреА 68 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдареАрдХ рд╣реИ, рдореИрдВ рд╡рд╛рджрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╣реБрдд рд╣реА рдЧрд╣рди рдЯрд┐рдХрдЯ рдХреА рддреБрд░рдВрдд рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рдкрд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдЧрд╛рдореА 3.4 рд░рд┐рд▓реАрдЬ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрддрдиреЗ рд╡рд┐рд╕реНрддреГрдд, рд╕реБрд╡рд┐рдЪрд╛рд░рд┐рдд рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╣рдлреНрддреЛрдВ рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛, рди рдХрд┐ рджрд┐рдиреЛрдВ рдпрд╛ рдорд╣реАрдиреЛрдВ рдореЗрдВред рдпрджрд┐ рдЖрдк рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВ, рдХреГрдкрдпрд╛ рдЯрд┐рдХрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рд╣рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВред

рдареАрдХ рд╣реИред рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рджреЛ рдХрд╛рд░рдХреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ:

  1. DRF рдХреЛ PUT рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рднрд▓реЗ рд╣реА рдпрд╣ рдореЙрдбрд▓ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ) рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рд╕рдВрд╕реНрдХрд░рдг = 0) рд╣реИред
  2. DRF PUT рдлрд╝реАрд▓реНрдб рдХреЛ рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛)

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, DRF рд╡рд░реНрддрдорд╛рди (рдбреЗрдЯрд╛рдмреЗрд╕) рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдорд╡рд░реНрддреА рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред рдореБрджреНрджреЗ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ #3648 (рдКрдкрд░ рднреА рдЙрджреНрдзреГрдд) рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ #1445 рдореЗрдВ рдПрдХ (рдкреВрд░реНрд╡ 3.x) рдЪрд░реНрдЪрд╛ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред

рдореИрдВ рдПрдХ рдареЛрд╕ (рдФрд░ рддреЗрдЬреА рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп) рдорд╛рдорд▓реЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рдХреГрдд рд╣реИ, рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ "рдЖрджрд░реНрд╢" рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореИрдВ рдбреАрдЖрд░рдПрдл рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЪ рдЧрд╣рд░рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдПрдХ рдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ:

  • рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдпрд╛ рддреЛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ (рдпрджрд┐ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ) рдПрдХ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рдмрдврд╝рд╛рдПрдВред рдореЙрдбрд▓-рд╡реНрдпрд╛рдкреА рд╕рддреНрдпрд╛рдкрди рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ/рдЪреВрдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЖрдВрд╢рд┐рдХ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдпрд╛ рддреЛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдпреЛрдВ рдкрд░ рдлрд╝реЙрд▓рдмреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЙрдбрд▓-рд╡реНрдпрд╛рдкреА рд╕рддреНрдпрд╛рдкрди рдЙрд╕ рд╕рдВрдпреБрдХреНрдд рдбреЗрдЯрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди "рдЧреИрд░-рдЖрдВрд╢рд┐рдХ" рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд░реНрдз-рдЖрдВрд╢рд┐рдХ рд╣реИ:

    • рдпрд╣ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдФрд░ рдЬрд┐рдирдореЗрдВ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИ

    • рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

    • рдпрд╣ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рд╣реИ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

рд╣рдо рдКрдкрд░ рдмреБрд▓реЗрдЯ (1) рдХреЛ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рд╣рдореЗрдВ рдЗрдирдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬрд╛рдирддреЗ рд╣реЛрдВ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдКрдкрд░ #2 рдмрджрд▓рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ #2683 рдореЗрдВ рдЖрдкрдХреЗ рддрд░реНрдХ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐:

рдореЙрдбрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЙрдбрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИрдВред рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдореВрд▓реНрдп рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП Model.object.create() рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реНрдердЧрд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдЙрд╕ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрджреНрдпрддрди рдХреЛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдореЙрдбрд▓ рдореЗрдВ рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рд╕реМрдВрдкрдирд╛) рдФрд░ рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЛ рдЙрд╕ рдирдП рдЙрджрд╛рд╣рд░рдг рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ #3648 рдореЗрдВ рдЕрдиреБрд░реЛрдзрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рдгрдд рд╣реЛрддрд╛ рд╣реИред

рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдкрде рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдпрд╣ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рддрдирд╛ рдЕрдЬреАрдм рд╣реИред рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рд╣реИ

  1. ModelSerializer рдХреЛ рдареАрдХ рдХрд░реЗрдВ,
  2. рдЗрд╕ рдЕрд░реНрдз-рдЖрдВрд╢рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВ, рдФрд░
  3. рдЙрд╕ рдзреНрд╡рдЬ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдПрдВ (рдкрд┐рдЫрд▓реА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП)

рдЙрд╕ рдЭрдВрдбреЗ рдХрд╛ рдирд╛рдо рдХреНрдпрд╛ рд╣реИ? рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╣реИ рдХрд┐ (рдХреБрдЫ рд╣рдж рддрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ) рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╢рд░реНрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ required==True and default==None ред рд╣рдо рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ partial рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирдП (рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдЕрд╕реНрдерд╛рдпреА) рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ quasi_partial рдмрдЪрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдордирдорд╛рдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ required==True and default==None рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рдЕрдХреНрд╖рдорддрд╛ рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддрддреНрдХрд╛рд▓ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдк рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рдореЗрдЯрд╛ рдореЗрдВ extra_kwargs рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ version рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдмрди рдЬрд╛рддрд╛ рд╣реИред

class ConcurrentModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = ConcurrentModel
        extra_kwargs = {'version': {'required': True}}

рдзрдиреНрдпрд╡рд╛рдж @anoopmalevред рд╡рд╣ рдореБрдЭреЗ рдкреНрд░реЛрдбрдХреНрд╢рди рдмреНрд░рд╛рдВрдЪ рдореЗрдВ рд░рдЦреЗрдЧрд╛ред

"рдЗрд╕ рдкрд░ рд╕реЛрдиреЗ" рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд┐рдХрди рд╣реИред рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рд╡рд╣ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣, рд╕рднреА рд╕реЗрд░рд┐рд▓рд╛рдЗрдЬрд╝рд░ рдЧреИрд░-рд╢рд╛рдорд┐рд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рд╣реИрдВ (рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдпрд╣ рдКрдкрд░ рдореЗрд░реЗ "рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ" рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рд▓рдЧрддрд╛ рд╣реИред
рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рдХрд╛рд░реНрд░рд╡рд╛рдИ рдпреЛрдЧреНрдп рдмрдпрд╛рди рдореЗрдВ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рд╣рдо рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрдм рддрдХ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╡реНрдпрд╛рдкрдХ рд╣реИред

рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  1. рдХрд┐рд╕реА рднреА рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ (рдирд┐рд╣рд┐рдд рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ) рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИ рдпрд╛ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рдореМрдЬреВрджрд╛ рдорд╛рди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦреЗрдВ
  2. рдЕрдиреНрдп рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдкрд▓рдмреНрдз рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

    1. рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рд╕рд╛рде рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░реЗрдВ

    2. blank рдФрд░/рдпрд╛ null рджреНрд╡рд╛рд░рд╛ рдирд┐рд╣рд┐рдд рдорд╛рди рд╕рд╣рд┐рдд, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░реЗрдВ

    3. рдПрдХ рдЕрдкрд╡рд╛рдж рдЙрдард╛рдПрдВ

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдкрд░ рд╕рддреНрдпрд╛рдкрди рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╛рдиреА рдЖрдк рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдлрд╝реАрд▓реНрдб рдкрд░ required=True рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИ?

рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣ рд╕рд╣реА рд▓рдЧрд╛?

рд╣рд╛рдБ (рдФрд░ рдЕрдзрд┐рдХ)ред рдЗрд╕ рддрд░рд╣ рдореИрдВ partial (рд╕рднреА рдлрд╝реАрд▓реНрдб рд╡реИрдХрд▓реНрдкрд┐рдХ) рдмрдирд╛рдо non-partial (рд╕рднреА рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ) рднреЗрдж рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред рдХреЗрд╡рд▓ рдПрдХ non-partial рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ (рд╕рдВрдХреАрд░реНрдг рдпрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд) рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ _рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдХреЛрдИ рдорд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдЙрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред_

рдЗрдЯреИрд▓рд┐рдХрд╛рдЗрдЬрд╝реНрдб рд╕реЗрдХреНрд╢рди рд╡рд╣ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдбреАрдЖрд░рдПрдл рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реИред рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд┐рд░реНрдл рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рджреВрд╕рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдорд┐рд▓рд╛ рд╣реБрдЖ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рдЖрдк "рдбрд┐рдлрд╝реЙрд▓реНрдЯ" рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд┐рддрдирд╛ рдЙрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ "рд╕рдЦреНрдд" рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ default рдХреЛ рдЗрд╕ рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк _рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк blank=True рдлрд╝реАрд▓реНрдб рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ... рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдПрдХ рдЕрдиреБрдкрд╕реНрдерд┐рдд рдорд╛рди рдПрдХ рд░рд┐рдХреНрдд рдорд╛рди рд╣реИред

@claytondaley рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ 2x рд╕реЗ DRF рдХреЗ рд╕рд╛рде OOL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

class VersionModelSerializer(serializers.ModelSerializer, BaseSerializer):
    _initial_version = 0

    _version = VersionField()

    def __init__(self, *args, **kwargs):
        super(VersionModelSerializer, self).__init__(*args, **kwargs)

        # version field should not be required if there is no object
        if self.instance is None and '_version' in self.fields and\
                getattr(self, 'parent', None) is None:
            self.fields['_version'].read_only = True
            self.fields['_version'].required = False

        # version field is required while updating instance
        if self.instance is not None and '_version' in self.fields:
            self.fields['_version'].required = True

        if self.instance is not None and hasattr(self.instance, '_version'):
            self._initial_version = self.instance._version

    def validate__version(self, value):
        if self.instance is not None:
            if not value and not isinstance(value, int):
                raise serializers.ValidationError(_(u"This field is required"))

        return value
   # more code & helpers

рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрднреА рднреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдХреНрдпрд╛ рдЗрд╕реЗ рджреБрд░реНрдШрдЯрдирд╛рд╡рд╢ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдореИрдВрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЧрд▓рдд рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╕реБрдирд╛ред

@claytondaley OOL рдХреЛ DRF рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдореЗрд░рд╛ рдХреЛрдб рдЬрд╛рдВрдЪреЗрдВ - рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрдбрд╝реЗ рдРрдк (1400 рдкрд░реАрдХреНрд╖рдг) рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред VersionField рд╕рд┐рд░реНрдл рдПрдХ IntegerField рд╣реИред

рдЖрдкрдиреЗ OOL рдХреЛ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рд╣рд╛рд░реНрдб-рдХреЛрдб рдХрд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЧрд▓рдд рдЬрдЧрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрджреНрдпрддрди (рдЙрд╕реА рдкреВрд░реНрд╡ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде) рд╕рднреА рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдкрд░ рдкрд╛рд░рд┐рдд рд╣реЛрдВрдЧреЗ ... рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрдЪрд╛рдиреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рдЬреАрдд рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ django-concurrency рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдУрдУрдПрд▓ рддрд░реНрдХ рдХреЛ рд╕реЗрд╡ рдПрдХреНрд╢рди (рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ) рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ UPDATE... WHERE version = submitted_version ред рдпрд╣ рдкрд░рдорд╛рдгреБ рд╣реИ рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреНрд░рдордмрджреНрдзрддрд╛ рддрд░реНрдХ рдореЗрдВ рдПрдХ рджреЛрд╖ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ ::

  • рдпрджрд┐ рдореЙрдбрд▓ рдореЗрдВ рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ DRF required=False рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред (рд╡реИрдз) рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдорд╛рди рд╕рдмрдорд┐рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдбреАрдЖрд░рдПрдл рдЙрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рдпрджрд┐ рд╡рд╣ рдлрд╝реАрд▓реНрдб рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рддрдерд╛рдкрд┐, DRF рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдкреНрд░рд╕реНрддреБрдд рдбреЗрдЯрд╛ рдХреЛ рд╡рд╕реНрддреБ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛ рджреЗрддрд╛ рд╣реИред

рдЬрдм рд╣рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред DRF рдЙрд╕ рдЕрдиреБрдмрдВрдз рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ... рдпрд╣ рдореМрдЬреВрджрд╛ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореБрджреНрджреЗ рдкрд░ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛, рдареЛрд╕ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдерд╛ред OOL рд╡рд╣ рдЖрджрд░реНрд╢ рдорд╛рдорд▓рд╛ рд╣реИред рд╕рдВрд╕реНрдХрд░рдг рдлрд╝реАрд▓реНрдб рдХрд╛ рдореМрдЬреВрджрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛ OOL рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝ рдХрд░ рдкреВрд░реЗ OOL рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВред рдпрд╣ (рдЬрд╛рд╣рд┐рд░ рд╣реИ) рдУрдУрдПрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИред

@claytondaley

рдЖрдкрдиреЗ OOL рдХреЛ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рд╣рд╛рд░реНрдб-рдХреЛрдб рдХрд┐рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдореИрдВрдиреЗ? рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореЗрд░реЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдХреЛрдИ рдУрдУрдПрд▓ рддрд░реНрдХ рдорд┐рд▓рд╛ рд╣реИ?

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЧрд▓рдд рдЬрдЧрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред

рд╢реНрд░реАрдорд╛рди, рдореИрдВ рдЕрднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣рд╛рдБ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╣рд╛рдБ рд╣реИред

рдореИрдВ django-concurrency рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдУрдУрдПрд▓ рддрд░реНрдХ рдХреЛ рд╕реЗрд╡ рдПрдХреНрд╢рди (рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ) рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

рдореИрдВ django-concurrency рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ :) рд▓реЗрдХрд┐рди рдпрд╣ рдореЙрдбрд▓ рд╕реНрддрд░ рд╣реИ, рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдирд╣реАрдВред рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕реНрддрд░ рдкрд░ рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ _version рдлрд╝реАрд▓реНрдб рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЬрдм рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдУрдУрдПрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ (рдЗрд╕ рднрд╛рдЧ рдХреЛ рдореИрдВрдиреЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ)
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рдПрдкреАрдЖрдИрд╡реНрдпреВ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдУрдУрдПрд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рднрд┐рдиреНрди рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде HTTP 409 рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ

рдЕрд╕рд▓ рдореЗрдВ, рдореИрдВ рдХрд┐рд╕реА рдРрд╕реЗ рдореБрджреНрджреЗ рдХреЗ рдХрд╛рд░рдг django-concurrency рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдСрдЯреЛрд░ рдиреЗ "рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИ: рдпрд╣ рдУрдУрдПрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдЬрдм obj.save(update_fields=['one', 'two', 'tree']) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдЦрд░рд╛рдм рдЕрднреНрдпрд╛рд╕ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреИрдХреЗрдЬ рдХреЛ рдлреЛрд░реНрдХ рдХрд┐рдпрд╛ред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдП рдЧрдП рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреА рд▓рд╛рдкрддрд╛ save рд╡рд┐рдзрд┐ рдпрд╣рд╛рдВ рджреА рдЧрдИ рд╣реИред рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

    def save(self, **kwargs):
        try:
            self.instance = super(VersionModelSerializer, self).save(**kwargs)
            return self.instance
        except VersionException:
            # Use select_for_update so we have some level of guarantee
            # that object won't be modified at least here at the same time
            # (but it may be modified somewhere else, where select_for_update
            # is not used!)
            with transaction.atomic():
                db_instance = self.instance.__class__.objects.\
                    select_for_update().get(pk=self.instance.pk)
                diff = self._get_serializer_diff(db_instance)

                # re-raise exception, so api client will receive friendly
                # printed diff with writable fields of current serializer
                if diff:
                    raise VersionException(diff)

                # otherwise re-try saving using db_instance
                self.instance = db_instance
                if self.is_valid():
                    return super(VersionModelSerializer, self).save(**kwargs)
                else:
                    # there are errors that could not be displayed to a user
                    # so api client should refresh & retry by itself
                    raise VersionException

        # instance.save() was interrupted by application error
        except ApplicationException as logic_exc:
            if self._initial_version != self.instance._version:
                raise VersionException

            raise logic_exc

рдорд╛рдлрд╝ рдХрд░рдирд╛ред рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рдереЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЖрдкрдХрд╛ рдХреЛрдб рдирд╣реАрдВ рдкрдврд╝рд╛ред рдореИрдВрдиреЗ рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рджреЗрдЦрд╛ред рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рд╣реИрдХ рдХрд░рдХреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП .... рдХреНрдпреЛрдВрдХрд┐ рдбреАрдЖрд░рдПрдл рддрд░реНрдХ рдореЗрдВ рджреЛрд╖ рд╕реНрд╡рдпрдВ рд╣реА рд╣реИред рдореИрдВ рдмрд┐рдВрджреБ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдУрдУрдПрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдФрд░ рдЖрдкрдХреЛ рдЙрд╕ рдХреЛрдб рдХреЛ django-concurrency рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг ( IGNORE_DEFAULT=False рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рд╡рд┐рд░реБрджреНрдз рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред django-concurrency рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ рдкреИрдЪ рд╕рдмрдорд┐рдЯ рдХрд┐рдпрд╛ред рдПрдХ рдЕрдЬреАрдм рдХреЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рдерд╛ рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╢рд┐рдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдХрд┐рдВрдЧ рдирд╣реАрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлреАрдЪрд░ рд╕рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ django-concurrency рдкреИрдХреЗрдЬ рд╣реИред

рдореИрдВрдиреЗ рдкреВрд░реЗ рдореБрджреНрджреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рдкрд╛рдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рддрд╣рдд рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХрд╛ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг)ред DRF 3.x 2.x рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рдРрд╕реЗ рд╣реА рд░рд╣рдиреЗ рджреЗрдВ :)

рдЖрдк рдЗрд╕реЗ рдореЙрдбрд▓ рд▓реЗрдпрд░ рдореЗрдВ рдареАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ (рдореЙрдбрд▓ рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ) рдкрд░ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИред OOL рдХреЛ рдПрдХ рддрд░рдл рд╕реЗрдЯ рдХрд░реЗрдВ... рдпрджрд┐ default рд╕реЗрдЯ рд╣реИ рддреЛ рд╣рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

рдПрдХ рдЧреИрд░ рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ "рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ (рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ)" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдлрд┐рд░ рднреА рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ? рдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░рдг рд╣реИ?

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ _version рдлрд╝реАрд▓реНрдб рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ https://github.com/gavinwahl/django-optimistic-lock рд╕реЗ рдореЙрдбрд▓ lvl рдХреЛрдб рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ django-concurrency рд╕реЗ рдирд╣реАрдВ рдЬреЛ рд▓рдЧрднрдЧ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рдЬрдЯрд┐рд▓ рд╣реИред

... рдЗрд╕рд▓рд┐рдП рдмрдЧ "рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдиреЗ рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ"ред рдпрд╣реА рд╡рд┐рдХрд▓реНрдк рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд) рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдЙрджреНрдзреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╡реЗ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдврд╝рд╛рдПрдВрдЧреЗред

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ (рд╕рд┐рд╡рд╛рдп рдЬрдм рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

(рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡рд╣ рдЙрд╕ рдирд┐рд░реНрдгрдп рдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдирд╣реАрдВ рд▓реЗ рд░рд╣рд╛ рд╣реИ)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреА рдмрд╛рдд рдЦреЛ рджреА рд╣реИ ..

(рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рд╡рд╣ рдЙрд╕ рдирд┐рд░реНрдгрдп рдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдирд╣реАрдВ рд▓реЗ рд░рд╣рд╛ рд╣реИ)

рдЙрд╕рдореЗрдВ рдЧрд▓рдд рдХреНрдпрд╛ рд╣реИ?

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рдХреЛрдг рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рджреЛред

  • рдорд╛рди рд▓реЗрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдореЙрдбрд▓ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рд╣реИ (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ) рдЬреЛ рдореЗрд░реЗ рдореЙрдбрд▓ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдирд╛рдирд╛ рдпрд╛ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдХрднреА рднреА рдПрдХ рдЕрд▓рдЧ рд╡рд╕реНрддреБ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ (рдЖрдИрдбреА рдШрдЯрд╛рдХрд░)

рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рд╕рд░рд▓ рдореЙрдбрд▓ рдФрд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдФрд░ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрд╕рдлрд▓/рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ?

рдореИрдВ рдХрд▓ рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ рджреЗрд░ рд╣реЛ рд░рд╣реА рд╣реИ ... рд▓реЗрдХрд┐рди рдореИрдВ рдЬрд┐рддрдирд╛ рдЧрд╣рд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рд╕рдордЭ # 3648 рдПрдХ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдореЙрдбрд▓ рдореЗрдВ рд╕рднреА рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рддрд░реНрдХ рдореЗрд░реЗ рд╕реЗ рдЕрд▓рдЧ рд╣реЛред

ModelSerializer рдмрдВрдзреЗ рд╣реБрдП рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?

рдореЗрд░рд╛ рдорддрд▓рдм рдпрдВрддреНрд░рд╡рддреН рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ ред рдПрдХ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдзрд╛рд░рдгрд╛ рд╕рдм рдХреБрдЫ (рдКрдкрд░ рдЙрджреНрдзреГрдд) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ get_field_kwargs рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдВ ), рддреЛ рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╣ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ?

рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рдЙрддреНрддрд░ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рджреЗрддрд╛ рд░рд╣рддрд╛ рд╣реВрдВ, "рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдореВрд▓реНрдп рдЬрдорд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" (рд▓реЗрдХрд┐рди рддрдм рдбреАрдЖрд░рдПрдл рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ)ред рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рдЬрд╡рд╛рдм рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЪреВрдХ рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП?

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдореИрдВ "рдкреВрд░реНрдг" рд╕рдорд╛рдзрд╛рди рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдПрдХ рджреВрд╕рд░рд╛ рдЙрддреНрддрд░ рд╣реИред рд╣рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдордирдорд╛рдирд╛) рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдХреЛ рд╕рд░рд▓/рдХрдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд╕рдВрдЧрдд рд╣реИред рдпрд╣ рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдм рдореБрдЭреЗ рдХрдо рд╕реЗ рдХрдо рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЬрд╛рдБрдЪ рдХреА рд╣реИ рдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ ModelForm рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ? (рдпрд╣ рдЦреБрдж рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ)

Django рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ 'рд░рд┐рдХреНрдд' рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЯрд┐рдХрдЯ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрд╕рдВрдмрдВрдзрд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдореЙрдбрд▓рд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЙрдбрд▓рдлреЙрд░реНрдо рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рдирд┐рдпрдВрддреНрд░рдг рдЖрд╡рд╢реНрдпрдХ рд╣реИ, 'рд╢реВрдиреНрдп' рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЗрдирдкреБрдЯ рдирд╣реАрдВ рд╣реИ рдФрд░ 'рдбрд┐рдлрд╝реЙрд▓реНрдЯ' рдХрд╛ рдЙрд╕ рддрд░реНрдХ рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред

рдореИрдВ рджреВрд╕рд░рд╛ рдЯрд┐рдХрдЯ рдЦреЛрд▓рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдХреНрдд рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред django рдЪрд░реНрдЪрд╛ рд╕рдореВрд╣ рд╕реЗ:

рдпрджрд┐ рд╣рдо рдПрдХ рдореМрдЬреВрджрд╛ рдореЙрдбрд▓ рдлреЙрд░реНрдо рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд░реНрдг рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВ, рд▓реЗрдХрд┐рди HTML рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдорд╛рдирд╡реАрдп рддреНрд░реБрдЯрд┐, рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдП, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд▓реЗрдЦрдХ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрддрд╛рдпрд╛) рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди, рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ), рдЬрдм рд╡рд╣ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ Django рдпрд╣ рдорд╛рди рд▓реЗрдЧрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд▓рд╛рдкрддрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдорд╛рди рдХреЛ рдорд┐рдЯрд╛рддреЗ рд╣реБрдП рдЙрд╕реЗ рдореЙрдбрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рд╣реИред .

рд╕реБрд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдиреБрдмрдВрдз рдХреА рджреВрд╕рд░реА рдЫрдорд╛рд╣реА рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рджрд╛рдпрд┐рддреНрд╡ рд╣реЛрдЧрд╛, рдЕрдиреБрдкрд╕реНрдерд┐рдд рдорд╛рди рдХреЛ рд░рд┐рдХреНрдд рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ред рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдо рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдореЙрдбрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рднрд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ (рдФрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, # 3648 рдХреЗ рдЕрдиреБрд░реВрдк)ред

@tomchristie рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рдХреБрдЫ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрдпреЛрдВ required рд░рд╛рдЬреНрдп рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб defaults рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ?

рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд░рд╛рдЬреНрдп рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ?

рдмрд╕ рдпрд╣: рдпрджрд┐ рдХрд┐рд╕реА рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рджрд░рдЕрд╕рд▓ рдореИрдВ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореЙрдбрд▓рдлреЙрд░реНрдо рдХреЛрдб рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╡рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдЪрдЯреАрдПрдордПрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛)ред рдпрджрд┐ рдбреАрдЖрд░рдПрдл рдЕрд▓рдЧ рддрд░реНрдХ рджреЗрдЧрд╛ рддреЛ 'рдбрд┐рдлрд╝реЙрд▓реНрдЯ' рдХрднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рд╣реИред

@pySilver рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдореЙрдбрд▓рдлреЙрд░реНрдо рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ:

# models.py

from django.db import models

class MyModel(models.Model):
    no_default = models.CharField(max_length=100)
    has_default = models.CharField(max_length=100, default="iAmTheDefault")

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рди рдХреЛ рдЕрднреА рднреА "рдЖрдВрд╢рд┐рдХ" рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ _update_ рдЖрдВрд╢рд┐рдХ рд╣реИред рдореИрдВ рдПрдХ рдкреВрд░реНрдг ("рдкреВрд░реНрдг") рдЕрджреНрдпрддрди рдХрд╛ рднреА рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЕрдирд╛рд╡рд╢реНрдпрдХ рдерд╛:

# in manage.py shell
>>> from django import forms
>>> from django.conf import settings
>>> from form_serializer.models import MyModel
>>>
>>> class MyModelForm(forms.ModelForm):
...     class Meta:
...         model = MyModel
...         fields = ['no_default', 'has_default']
...
>>>
>>> partial = MyModel.objects.create()
>>> partial.id = 2
>>> partial.no_default = "Must replace me"
>>> partial.has_default = "I should be replaced"
>>> partial.save()
>>>
>>>
>>> POST_PARTIAL = {
...     "id": 2,
...     "no_default": "must change me",
... }
>>>
>>>
>>> form_partial = MyModelForm(POST_PARTIAL)
>>> form_partial.is_valid()
False
>>> form_partial._errors
{'has_default': [u'This field is required.']}

ModelForm рдХреЛ рдЗрд╕ рдЗрдирдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рднреА рд╕реЛрдЪрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред рдпрд╣ рджреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд░рд╛рдЬреНрдп рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ?

рдмрд╕ рдпрд╣: рдпрджрд┐ рдХрд┐рд╕реА рдореЙрдбрд▓ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

@tomchristie рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╕рд╣рдордд рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ?

  • рдмрдирд╛рдиреЗ рдкрд░, рдореБрдЭреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ (рддреБрдЪреНрдЫ, рд╣рд░ рдХреЛрдИ рд╕рд╣рдордд рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИ)
  • рдЕрджреНрдпрддрди рд╣реЛрдиреЗ рдкрд░, рдореБрдЭреЗ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдкрдбреЗрдЯ рдкрд░ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдПрдХ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рджреЛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ "рдкреВрд░реНрдг" рд░рд┐рдХреЙрд░реНрдб рднреЗрдЬ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреВрд░рд╛ рд░рд┐рдХреЙрд░реНрдб рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЕрджреНрдпрддрди рдкрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдореВрд▓реНрдп рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ред рдореИрдВ рдмрд┐рдВрджреБ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рдирд╛ рдореЗрд░реЗ рдкреАрдУрд╡реА рд╕реЗ рдкреНрд░рддрд┐-рд╕рд╣рдЬ рд╣реЛрдЧрд╛ред

(рдЕрдЧрд░ рдХреБрдЫ рднреА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ - рдкреБрдЯ рдЕрднреА рднреА рдмреЗрд╡рдХреВрдл рд╣реЛрдЧрд╛, рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рд╣реИ, рд╕рдВрднрд╡рддрдГ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЬреАрдм рд╣реИ)

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рддрд╛; рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рд╕рднреА рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рдЦреНрдд рд╣реЛрдВ рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХрд╛ рдЖрдВрд╢рд┐рдХ рдмрдирд╛рдо рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рднреЗрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА (рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдо рджреЛрдиреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЖрдВрд╢рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдЕрджреНрдпрддрди 100% рдЖрдВрд╢рд┐рдХ рд╣реИрдВ
  • default рдФрд░ blank (рддрд╛рд░реНрдХрд┐рдХ рдЕрдкрд╡рд╛рдж) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ CREATEs (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдЖрдВрд╢рд┐рдХ рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореЙрдбрд▓/рдбреЗрдЯрд╛рдмреЗрд╕ рдмрд╛рдзрд╛рдПрдВ рдмрд╛рдзреНрдп рд╣реЛрддреА рд╣реИрдВред

рдореИрдВ рд╕рд┐рд░реНрдл рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк default рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖-рдорд╛рдорд▓реЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдореМрдЬреВрджрд╛ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рдЦреНрдд рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡реЗ ModelForm рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднреАрддрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЕрд╕рдВрддреБрд▓рди рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реИ рдЬрдм рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рддрд░рд╣ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ "рд╡рд┐рд░рд╛рд╕рдд" рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВ, рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬреЛрдбрд╝реЗрдВ (рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛), рдФрд░ рдмрд╛рдж рдХреЗ рдкреНрд░рдореБрдЦ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓реЗрдВред

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ Django рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЛ, рддреЛ рдЖрдк рд╡реИрд╕реЗ рднреА рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред ModelForm рд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдзрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рд╡реЗ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред

рдореЗрд░реЗ рджреЛ рд╕реЗрдВрдЯ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛:
рдореИрдВ @claytondaley рд╕реЗ рд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред PUT рдПрдХ рдмреЗрдХрд╛рд░ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ, PATCH рдореМрдЬреВрджрд╛ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдПрдХ рдЕрджреНрдпрддрди рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ:

class Profiles(models.Model):
    username = models.CharField()
    role = models.CharField(default='member', choices=(
        ('member', 'Member'), 
        ('moderator', 'Moderator'),
        ('admin', 'Admin'), 
    ))

рдирдИ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рджрд╕реНрдп рднреВрдорд┐рдХрд╛ рд╣реЛрддреА рд╣реИред рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рд▓реЗрдВ:

POST /profiles username=moe
PUT /profiles/1 username=curly
PATCH /profiles/1 username=larry&role=admin
PUT /profiles/1 username=curly

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦрдбрд╝рд╛ рд╣реИ, рдкрд╣рд▓реЗ PUT рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдбреЗрдЯрд╛ рдореЗрдВ {'username': 'curly', 'role': 'member'} рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ рдкреБрдЯ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЗ рдкрд╛рд╕ {'username': 'curly', 'role': 'admin'} рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдирдкреБрдВрд╕рдХрддрд╛ рдирд╣реАрдВ рдЯреВрдЯрддреА? (рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ - рд╡реИрдз рд░реВрдк рд╕реЗ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдВ)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрдЪ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд░ рдХреЛрдИ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рд╣реИред

рджреВрд╕рд░реЗ PUT рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЗ рдкрд╛рд╕ {'рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо': 'рдШреБрдВрдШрд░рд╛рд▓реЗ', 'рднреВрдорд┐рдХрд╛': 'рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ'} рд╣реЛрдЧрд╛

рдореБрдЭреЗ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдпрджрд┐ рднреВрдорд┐рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА (рдореИрдВ рдЗрд╕ replace рд╡рд╕реНрддреБ рдЪрд░реНрдЪрд╛ рдХрд╛ рдХрд╛рд░рдг рджреЗрдЦрддрд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдореБрджреНрджреЗ рдирд╣реАрдВ рд╣реИрдВ)

рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрднреА рддрдХ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ

рдпрд╣рд╛рдВ рд╡рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдкреИрдЪ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ :)
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рд╕рдореЗрдХрди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдУрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ w/рдореЙрдбрд▓ рд╡рд░реНрдЬрдирд┐рдВрдЧ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ PUT рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ (рдпрджрд┐ рдорд╛рди рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ), рд╕рдорд╡рд░реНрддреА рдЕрдкрд╡рд╛рдж рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реБрдПред

рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ RESTful RFC рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЗрдВ рдХрдо рд╕реЗ рдХрдо _are_ рд╕рдВрдЧрдд рдореЛрдб рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛ рдЖрд░рдИрдПрд╕рдЯреА рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореЗрд░рд╛ рдореВрд▓ рддрд░реНрдХ рдкрд╣рд▓реЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рдерд╛, рд▓реЗрдХрд┐рди рдЖрд░рдПрдлрд╕реА (рдзрд╛рд░рд╛ 4.3.4) рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ (рдЬреЛрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛):

POST рдФрд░ PUT рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рдХреЛ рд╕рдВрд▓рдЧреНрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрд░рд╛рджреЗ рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред POST рдЕрдиреБрд░реЛрдз рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЕрдкрдиреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрд▓рдЧреНрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рдЬрдмрдХрд┐ PUT рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рд▓рдХреНрд╖реНрдп рд╕рдВрд╕рд╛рдзрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
...
рдПрдХ рдореВрд▓ рд╕рд░реНрд╡рд░ рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд▓рдХреНрд╖реНрдп рд╕рдВрд╕рд╛рдзрди рдкрд░ рдкреБрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрд╕реЗ рдкреБрдЯ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП 400 (рдЦрд░рд╛рдм рдЕрдиреБрд░реЛрдз) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреЗрдЬрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдордЧреНрд░реА-рд╢реНрд░реЗрдгреА рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╝реАрд▓реНрдб ([рдЖрд░рдПрдлрд╕реА7233] рдХреА рдзрд╛рд░рд╛ 4.2) рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреЗрд▓реЛрдб рдЖрдВрд╢рд┐рдХ рд╕рд╛рдордЧреНрд░реА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧрд▓рддреА рд╕реЗ рдПрдХ рдкреВрд░реНрдг рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдЖрдВрд╢рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдЕрдкрдбреЗрдЯ рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рд╕реЗ рдкрд╣рдЪрд╛рдиреЗ рдЧрдП рд╕рдВрд╕рд╛рдзрди рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рдХреЗ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдмрдбрд╝реЗ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд┐рд╕реЗ рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [рдЖрд░рдПрдлрд╕реА 5789] рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреИрдЪ рд╡рд┐рдзрд┐)

рддреЛ рдПрдХ рдкреБрдЯ рдХрднреА рднреА рдЖрдВрд╢рд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рднреА рджреЗрдЦреЗрдВ, рдпрд╣рд╛рдВ )ред рд╣рд╛рд▓рд╛рдБрдХрд┐, PUT рдкрд░ рдЕрдиреБрднрд╛рдЧ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

PUT рд╡рд┐рдзрд┐ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╕рдВрд╕рд╛рдзрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдиреБрд░реЛрдз рд╕рдВрджреЗрд╢ рдкреЗрд▓реЛрдб рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдпрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдПрдХ рд╕рдлрд▓ рдкреБрдЯ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ рдХрд┐ рдЙрд╕реА рд▓рдХреНрд╖реНрдп рд╕рдВрд╕рд╛рдзрди рдкрд░ рдмрд╛рдж рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк 200 (рдареАрдХ) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдордХрдХреНрд╖ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЬреАрдИрдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рдВрджреБ (рдЬрдмрдХрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ) рдореЗрд░реЗ "рд╕рдордЭреМрддрд╛" рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗрддрд╛ рд╣реИред рдЬрдмрдХрд┐ рдмреНрд▓реИрдВрдХ/рдбрд┐рдлреЙрд▓реНрдЯ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдпрд╣ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рддрд╛рдмреВрдд рдореЗрдВ рдХреАрд▓ рд╢рд╛рдпрдж рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рднреНрд░рдо рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджреЗрд╣ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд▓рд╛рдкрддрд╛ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкреИрдЪ рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рдкреБрдЯ рдХреЗ рдмрдЬрд╛рдп "рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕реЗрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред POST (4.3.3) рдкрд░ рдЕрдиреБрднрд╛рдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рддрд╛ рд╣реИ:

POST рд╡рд┐рдзрд┐ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╕рдВрд╕рд╛рдзрди рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, POST рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ (рджреВрд╕рд░реЛрдВ рдХреЗ рдмреАрдЪ) рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • рдбреЗрдЯрд╛-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛, рдЬреИрд╕реЗ рдХрд┐ HTML рдлреЙрд░реНрдо рдореЗрдВ рджрд░реНрдЬ рдХреА рдЧрдИ рдлрд╝реАрд▓реНрдб;

...

  • рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЗ рдореМрдЬреВрджрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдирд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП POST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реИ:

  • рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдирд╛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИ
  • POST рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдирд┐рдпрдо рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рд╣реЛ рд╕рдХреЗрдВ
  • рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЖрдИрдбреА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдХреНрд░рд┐рдПрдЯ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдбреАрдЖрд░рдПрдл рдкреВрд░реНрдг рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЖрдХрд╛рдВрдХреНрд╖рд╛ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕реНрдкреЗрдХ рдкреБрдЯ рдСрдкрд░реЗрд╢рди (рдпрд╛рдиреА рдкреВрд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓рдирд╛) рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛред рд╕рдмрд╕реЗ рд╕рд░рд▓ (рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдо рд╕реЗ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛) рдЙрддреНрддрд░ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рднреА рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреБрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреАрд╡рд░реНрдб (рдкреИрдЪ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреЛрд╕реНрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдРрдк рдХреЛ drf3.4.x рдкрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдкреБрдЯ рдореБрджреНрджрд╛ рдорд╛рд░рд╛ рд╣реИ :)

<strong i="6">@cached_property</strong>
    def _writable_fields(self):
        return [
            field for field in self.fields.values()
            if (not field.read_only) or (field.default is not empty)
        ]

рдЗрд╕рд╕реЗ рдореЗрд░реЗ .validated_data рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ PUT рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рднреАрддрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рд╕реНрддрд░ рдкрд░ рдорд╛рди default= рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдереЗред рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВ рдЙрди рдХреБрдЫ рдлрд╝реАрд▓реНрдб рдХреЛ рдиреАрд▓реЗ рд░рдВрдЧ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реВрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдЦреБрд╢, рдореИрдВ рдХрд╕реНрдЯрдо рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

@pySilver рдореИрдВ рдирд╡реАрдирддрдо рдЯрд┐рдкреНрдкрдгреА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

@rpkilby "рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ ... рдХреНрдпрд╛ рдпрд╣ рдмреЗрд╡рдХреВрдлреА рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИ"

рдирд╣реАрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдЯ рдЕрдиреБрд░реЛрдз рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдмреЗрдХрд╛рд░ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЗрд╕ рдмреАрдЪ рд░рд╛рдЬреНрдп рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд░реАрд╕реЗрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

PUT рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВред

  • рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ required=False рдпрд╛ рдЙрдирдХреЗ рдкрд╛рд╕ default рди рд╣реЛред (рдореМрдЬреВрджрд╛)
  • рд╕рднреА рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред (рд╕рдЦреНрдд, рдкреВрд░реНрдг рдЕрджреНрдпрддрди _but_ рдХреЗ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рд╢рдмреНрджрд╛рд░реНрде рдЕрдЬреАрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ POST рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрдорд╛рдг рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдЕрдзрд┐рдХ рдХрдареЛрд░ рд╣реИ)
  • рдХрд┐рд╕реА рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╛рдиреА рдмрд╕ рдорд┐рд░рд░ рдкреИрдЪ рд╡реНрдпрд╡рд╣рд╛рд░)

рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдХреЛрдИ _absolute_ рд╕рд╣реА рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рдмрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдРрд╕рд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд┐рд╕реЗ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ PUT рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, PUT-as-create рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рд╡реИрдз рдСрдкрд░реЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ POST рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ "рдЖрд╡рд╢реНрдпрдХрддрд╛" рд╢рдмреНрджрд╛рд░реНрде рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдореИрдВ _strongly_ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдзрд╛рд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕реЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдорд╛рдорд▓рд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдирд╛ рд╣реИ, рддреЛ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@tomchristie рдореИрдВ рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ language рдлрд╝реАрд▓реНрдб рдФрд░ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╣реИ:

class Book(models.Model):
      title = models.CharField(max_length=100)
      language = models.ChoiceField(default='en', choices=(('pl', 'Polish'), ('en', 'English'))

class BookUpdateSerialzier(serializers.ModelSerializer):
      # language is readonly, I dont want to let users update that field using this serializer
      language = serializers.ChoiceField(default='en', choices=(('pl', 'Polish'), ('en', 'English'), read_only=True)
      class Meta:
          model = MyModel
          fields = ('title', 'language', )

book = Book(title="To be or 42", language="pl")
book.save()

s = BookUpdateSerialzier(book, data={'title': 'Foobar'}, partial=True)
s.is_valid()
assert 'language' in s.validated_data # !!! 
assert 'pl' == s.validated_data # AssertionError... here :(
  • рдореИрдВрдиреЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ language рдкрд╛рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред update рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдЧрд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдпрд╣ рдХрдо рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ validated_data['language'] book.language рд╣реЛрдЧрд╛ред

@pySilver - рд╣рд╛рдБ, рдЗрд╕реЗ рдЖрдЬ рд╣реА https://github.com/tomchristie/django-rest-framework/pull/4346 рдореЗрдВ рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдлрд╝реАрд▓реНрдб рдкрд░ default= рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ ModelField рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

@tomchristie рдХреНрдпрд╛ рдЖрдк рдХрдо рд╕реЗ рдХрдо рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди PUT рд╡реНрдпрд╡рд╣рд╛рд░ RFC рдпреБрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ? рдФрд░ рдпрд╣ рдХрд┐ рдореЗрд░реЗ рджреЛрдиреЛрдВ рд╕реБрдЭрд╛рд╡ (рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдЪреВрдХ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ) рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ?

@tomchristie рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ!

рдЬреИрд╕рд╛ рдХрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдлрд╝реАрд▓реНрдб рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ = рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореЙрдбрд▓рдлрд┐рд▓реНрдб рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

рд╣рд╛рдБ, рдореИрдВ рдЗрд╕реЗ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдпрд╣ рдЕрдВрдд рдореЗрдВ рдбреВрдм рд░рд╣рд╛ рд╣реИ рдХрд┐ @tomchristie рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП/рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЙрдирдХреА рдЖрдкрддреНрддрд┐рдпрд╛рдВ (рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ) рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдПрдХрд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рднреА рдЖрд░рдИрдПрд╕рдЯреА рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрдирдХреА рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдЦреНрдд рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдПрдХ POST рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдЪреВрдВрдХрд┐ рдЖрд░рдИрдПрд╕рдЯреА рдореЛрдб рдЕрд╕рдВрдЧрдд рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдПрдХрд▓ рдореЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдпрд╣ рдЖрдкрддреНрддрд┐ рдХреА рдЕрд╕рд▓реА рдЬрдбрд╝ рд╣реИ, рддреЛ рдЖрдЗрдП рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдПрдХ рдПрдХрд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рднреА рдЖрд░рдИрдПрд╕рдЯреА рдореЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдореЗрд░рд╛ рдСрдл-рдж-рдХрдл рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдВрд╢рд┐рдХ рдмрдирд╛рдо рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдЧрд▓рдд рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  • рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдВрд╢рд┐рдХ рдФрд░ рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╣реИрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рднреА рдореЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдВрд╢рд┐рдХ рдмрдирд╛рдо рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рд╕рддреНрдпрд╛рдкрди (рдпрд╛ рдЗрд╕ рдирд╕ рдореЗрдВ рдХреБрдЫ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдЖрд░рдИрдПрд╕рдЯреА рдореЛрдб рдХреЛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рддреНрдпрд╛рдкрди рдореЛрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рдЖрд░рдИрдПрд╕рдЯреА рдореЛрдб рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рди рд╣реА, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ, рдХреНрдпрд╛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЗ рдкрд╛рд╕ рднреА рдореЛрдб рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ)ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдбреАрдЖрд░рдПрдл рдХреЛ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП (рд▓рдЧрднрдЧ replace=True PUT рдХреЗ рд▓рд┐рдП)ред рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдпрд╣ рддрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП (рд╕рднреА рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ)ред

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдореЛрдЯрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдЧрддрд┐рд░реЛрдз рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, PUT-as-create рд╕реНрд╡рдпрдВ рдПрдХ рд╡реИрдз рдСрдкрд░реЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ POST рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ "рдЖрд╡рд╢реНрдпрдХрддрд╛" рд╢рдмреНрджрд╛рд░реНрде рд╣реЛрдВред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ рдкреБрдЯ рдХреЗ рд╕рд╛рде рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рд╕рдорд╛рди рд╣реИрдВред PUT рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

PUT рд╡рд┐рдзрд┐ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рд╕рдВрд╕рд╛рдзрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдиреБрд░реЛрдз рд╕рдВрджреЗрд╢ рдкреЗрд▓реЛрдб рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдпрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдирд┐рд░реНрдорд╛рдг рд╢рдмреНрджрд╛рд░реНрде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ:

  • рдкрджрд╕реЗ /citizen/ рдПрдХ SSN (рд╕рд╛рдорд╛рдЬрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрдЦреНрдпрд╛) рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ
  • рд░рдЦрдирд╛рд╕реЗ /citizen/<SSN> рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ SSN рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрд╕ рдПрд╕рдПрд╕рдПрди рдореЗрдВ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ "рдЖрдИрдбреА" рдХреЛ рдкреБрдЯ рдХреЗ рдпреВрдЖрд░рдЖрдИ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдк рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, POST рдореЗрдВ "id" рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред

рдЪреВрдВрдХрд┐ "рдЖрдИрдбреА" рдХреЛ рдкреБрдЯ рдХреЗ рдпреВрдЖрд░рдЖрдИ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдк рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, POST рдореЗрдВ "id" рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ "рдореЗрдХ рдкреБрдЯ рдХреЛ рд╕рдЦреНрддреА рд╕реЗ _all_ рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкреБрдЯ-рдПрдЬрд╝-рдХреНрд░рд┐рдПрдЯ рдХрд╛ POST-as-create wrt рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдпрд╣ рдХрд╣рдХрд░ рдХрд┐ рдореИрдВ рдкреБрдЯ-рдЗрдЬрд╝-рд╕рдЦреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд░рдЦрдиреЗ рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЖ рд░рд╣рд╛ рд╣реВрдВред

(рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ _all_ рдлрд╝реАрд▓реНрдб рдХреА рд╕рдЦреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдХрд┐ _no_ рдлрд╝реАрд▓реНрдб PATCH рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдФрд░ POST рдХреЗ рд▓рд┐рдП required= рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)

рдПрдХ рдПрдХрд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕рднреА рдЖрд░рдИрдПрд╕рдЯреА рдореЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдХреИрд╕реЗ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рд╣рдо рдХреНрд░рд┐рдПрдЯ, рдЕрдкрдбреЗрдЯ рдФрд░ рдЖрдВрд╢рд┐рдХ рдЕрдкрдбреЗрдЯ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдЖрдк create рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PUT рдпрд╛ POST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд░реНрде рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП create рдХреЛ REST рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднреЗрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ is_valid рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рдореЛрдб рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ:

  • рдХреЛрдИ рдлрд╝реАрд▓реНрдб-рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ (рдкреИрдЪ)
  • required рдЭрдВрдбреЗ (рдкреЛрд╕реНрдЯ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рддреНрдпрд╛рдкрди
  • рд╕рдЦреНрдд рдХреНрд╖реЗрддреНрд░-рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕рддреНрдпрд╛рдкрди (PUT)

рдХреАрд╡рд░реНрдб-рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реНрдХ рдХреЛ рд╕реАрдЖрд░рдпреВрдбреА рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдХрд░, рд╣рдо рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдФрд░ рдбреАрдЖрд░рдПрдл рдХреЗ рдмреАрдЪ рдпреБрдЧреНрдорди рдХреЛ рднреА рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рдореЛрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдереЗ, рддреЛ рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд▓реЗ рд╣реЛрдВрдЧреЗ (рднрд▓реЗ рд╣реА рд╣рдо рдЕрдкрдиреЗ 3 рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 3 рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ)ред

рдЖрдк рдореБрдЭреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред :)

.is_valid() рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рднрд┐рдиреНрди "рд╕рддреНрдпрд╛рдкрди рдореЛрдб" рдПрдХ рдЙрдерд▓-рдкреБрдерд▓ рд╣реИ рдЬреЛ рдЙрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред

рд╣рдо рд╢рд╛рдпрдж рдореМрдЬреВрджрд╛ 'рдЖрдВрд╢рд┐рдХ = рд╕рд╣реА' рдЗрдХрд╛рдИ kwarg рдХреЗ рд╕рдордХрдХреНрд╖ 'рдкреВрд░реНрдг = рд╕рд╣реА' рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдлрд┐рдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдЪреАрдЬреЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЕрднреА рднреА "рд╕рдЦреНрдд рдлрд╝реАрд▓реНрдб" рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧреАред

рдХреНрдпрд╛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ? рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЖрд░рдИрдПрд╕рдЯреА рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╕рдХрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╣реА рдЬрдЧрд╣ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рдХреЗрд╡рд▓ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╣ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ,

рдПрдХ рддрд░рдл рд╕реЗ рдЕрдзрд┐рдХ ... рдХреНрдпрд╛ Django рдХреА рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдЕрд▓рдЧрд╛рд╡ (рдЖрд╡рдВрдЯрди) рдХреА рдХрд╣реАрдВ рдЕрдЪреНрдЫреА рдЪрд░реНрдЪрд╛ рд╣реИ? рдореБрдЭреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ Django рдХреЗ рдЕрдиреБрдХреВрд▓ рдЙрддреНрддрд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ "рдХреНрд░рдордмрджреНрдзрддрд╛ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рд╣рд┐рд╕реНрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ" рдЬреИрд╕реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рдкрддрд╛ рд╣реИред 1.9 рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╛рдВрдХрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░, рд╕рдЦреНрддреА рд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ:

  1. рдореЙрдбрд▓ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░
  2. "рд╡реНрдпреВ" (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд░рдИрдПрд╕рдЯреА рдореЛрдб рдкреНрд░реЛрд╕реЗрд╕рд░) рдЙрд╕ рджреГрд╢реНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдирд┐рдпрдореЛрдВ (рдЖрд░рдПрдлрд╕реА рдХреА рддрд░рд╣) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рд╕рддреНрдпрд╛рдкрди рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ 100% рдЖрдВрд╢рд┐рдХ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ I/O рдирд┐рдпрдореЛрдВ рдЬреИрд╕реЗ "рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП" рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ ModelSerializer рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧрд╛ред

рдХреНрдпрд╛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ?

рд╣рд╛рдВред

1.9 рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╛рдВрдХрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

Django рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рдХреНрд░рдорд╛рдВрдХрди рд╡реЗрдм APIS рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбрдВрдкрд┐рдВрдЧ рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдлрд┐рдХреНрд╕реНрдЪрд░ рддрдХ рд╕реАрдорд┐рдд рд╣реИред

рдЖрдк Django рдФрд░ DRF рджреЛрдиреЛрдВ рдХреА рд╡рд╛рд╕реНрддреБ рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдореБрдЭрд╕реЗ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреИрд╕реЗред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ init kwarg рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рд╣реА рдЕрдиреБрднрд╡ рд╣реИ ... "рдСрди-рдбрд┐рдорд╛рдВрдб" рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдХреЛ рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ред рдПрдХрдорд╛рддреНрд░ рд╕реАрдорд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ "рдордХреНрдЦреА рдкрд░" рдкреБрди: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдПрдХрд▓ рдЙрдкрдпреЛрдЧ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдбреА-рдореАрд▓рд╕реНрдЯреЛрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рд╣рдо v3.7 . рдХреЗ рдмрд╛рдж рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЖрдк рд▓реЛрдЧреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдорд╡рд░реНрддреА рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдХрдЯ рдирд╣реАрдВ рд╣реИред рдЕрд╕рд▓реА рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдПрдХрд▓ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡рд░реНрддрдорд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдПрдХ рдкреБрдЯ рдФрд░ рдкреЛрд╕реНрдЯ рджреЛрдиреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред Concurrency рдиреЗ рдЕрднреА "рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг" рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред

TL; DR рдЖрдк рдЯреЙрдо рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдлрд┐рдХреНрд╕ рдкрд░ рд╢реБрд░реВ рдХрд░рдХреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рдЕрд╡рд░реБрджреНрдз рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди PUT рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдлрд╝реАрд▓реНрдб рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде (рдХрдо рд╕реЗ рдХрдо) рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:

  1. рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ HTTP рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдПрдХ-рд╕реЗ-рдПрдХ рдореИрдкрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг create рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ PUT рдФрд░ POST рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ create-by- PUT рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рд╣реИ рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реБрдзрд╛рд░ рд╢рд╛рдпрдж рдХреБрдЫ рдирд╣реАрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред
  2. рд╣рдореЗрдВ PUT (#3648, #4703 рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рднрд╛рд╡рдирд╛) рдореЗрдВ рд╕рднреА рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдПрдХ рд╢реВрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред PUT рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ POST рдЬреИрд╕реА рд╣реА (рдореЙрдбрд▓-рд╡реНрдпреБрддреНрдкрдиреНрди) рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВред

рдЕрд╕рд▓реА рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд▓рд╛рдкрддрд╛ рдбреЗрдЯрд╛ рдФрд░ #3648, #4703 рдореЗрдВ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИред рдпрджрд┐ рд╣рдо if_missing_use_default рдЬреИрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕рднреА HTTP рдореЛрдб (рдХреНрд░рд┐рдПрдЯ-рдмрд╛рдп- PUT рд╕рд╣рд┐рдд) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░реЗ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдиреЗ рдЗрд╕реЗ partial рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЖрд╕рд╛рди (рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред

рдЕрдЧрд░ рд╣рдо if_missing_use_default рдЬреИрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдПрдХ рд╕рдЦреНрдд "рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ" рдПрдХ рдЖрдзрд╛рд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдЗрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдЦреНрдд "рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ" рдореЛрдб рднреА рдЗрд╕реЗ рдХреЛрд░ рдореЗрдВ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдФрд░ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ "рдлрд╝реАрд▓реНрдб рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рд▓реЗрдХрд┐рди рдореЙрдбрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдпрджрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ" - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдХрд╛рдЙрдВрдЯрд░-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреЗрд╢ рдХрд░реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдмрдирд╛рдпрд╛_рдПрдЯ" рдлрд╝реАрд▓реНрдб, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЦреБрдж рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдпрджрд┐ рд╣рдо рдХрдареЛрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдХрдареЛрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЗрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдП, рдлрд┐рд░ рд╣рдорд╛рд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЙрд╕рд╕реЗ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХреЗрдВред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рд╣рдо рдореВрд▓ рд╕реЗ рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдЧреБрдгреЛрдВ рдХрд╛ рдЖрдХрд▓рди рдХрд░ рд╕рдХреЗрдВ рдареЛрд╕ рддрд░реАрдХрд╛ред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд▓реЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реБрдИ, рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рднреА рдЦреБрд╢реА рд╣реБрдИред

рдкреБрдЯ-рдЗрдЬрд╝-рд╕рдЦреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд░рдЦрдиреЗ рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЖ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдЕрднреА рднреА рдЦрдбрд╝рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдкрд╣рд▓реВ рдкрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдХреЛрдИ рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдкреНрд░рддрд┐-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "рдмрдирд╛рдпрд╛_рдПрдЯ" рдлрд╝реАрд▓реНрдб, рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд╡рдпрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИ)ред

рдПрдХ created_at рдлрд╝реАрд▓реНрдб read_only (рдпрд╛ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрди рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ (рд╕рд╛рдорд╛рдиреНрдп рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░)ред рдХрд╛рдЙрдВрдЯрд░-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЗрд╡рд▓ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рддрд┐-рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓реЗрдЧрд╛ред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд▓реЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реБрдИ, рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреИрдХреЗрдЬ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рднреА рдЦреБрд╢реА рд╣реБрдИред

рдмрд┐рд▓реНрдХреБрд▓ред "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рднрд┐рдиреНрдирддрд╛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рдорд╛рдорд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд╣реИ (рдПрдХ рд╡рд┐рдзрд┐) рдФрд░ (рдпрджрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдореЗрдВ рдЦрд░реАрджрддреЗ рд╣реИрдВ) рд╕рднреА рдЧреИрд░-рдЖрдВрд╢рд┐рдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

4 рдШрдВрдЯреЗ рдкрд╣рд▓реЗ tomchristie рдиреЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛

рд╢рд╛рдпрдж рдЖрдк "рдкреАрдЖрд░ рд╡реЗрд▓рдХрдо" рдпрд╛ "рддреГрддреАрдп рдкрдХреНрд╖ рдкреНрд▓рдЧрдЗрди" рдЬреИрд╕реЗ рд▓реЗрдмрд▓ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реИрдз/рд╕реНрд╡реАрдХреГрдд рдореБрджреНрджреЛрдВ рдХреЛ рдЦреЛрд▓рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдЕрдХреНрд╕рд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рдореБрджреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╣реА рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЗрд╕рдХреА рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИред рдореИрдВ рдмрдВрдж рдореБрджреНрджреЛрдВ рдХреЛ "рдЕрдорд╛рдиреНрдп" рдпрд╛ "рдирд┐рд╢реНрдЪрд┐рдд" рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред рдХреБрдЫ "рд╡реИрдз рд▓реЗрдХрд┐рди рдмрдВрдж" рдореБрджреНрджреЛрдВ рдХреЛ рд╣рдЬрд╛рд░реЛрдВ рдЕрдорд╛рдиреНрдп/рдирд┐рд╢реНрдЪрд┐рдд рдореБрджреНрджреЛрдВ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рд╕реЗ рдХреБрд╢рд▓ рдЦреЛрдЬ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдЖрдк рдЬрд╛рдирддреЗ рд╣реЛрдВ рдХрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред

рд╢рд╛рдпрдж рдЖрдк "рдкреАрдЖрд░ рд╡реЗрд▓рдХрдо" рдпрд╛ "рддреГрддреАрдп рдкрдХреНрд╖ рдкреНрд▓рдЧрдЗрди" рдЬреИрд╕реЗ рд▓реЗрдмрд▓ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдпрд╣ рдХрд╛рдлреА рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдЗрд╢реНрдпреВ рдЯреНрд░реИрдХрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд╣реА рд╕рдХреНрд░рд┐рдп рдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдпреЛрдЧреНрдп рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗред

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдХрд╕рдХрд░ рджрд╛рдпрд░реЗ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрднреА-рдХрднреА рдЙрди рдореБрджреНрджреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ рдЪреБрдирддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдЕрднреА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ "рдХреЛрд░ рдЯреАрдо рддрддреНрдХрд╛рд▓ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИ" рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рдпрд╣ рдмрд╛рд░-рдмрд╛рд░ рдЖрддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рддреАрд╕рд░рд╛ рдкрдХреНрд╖ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЗрд╕рдХрд╛ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реИрдз/рд╕реНрд╡реАрдХреГрдд рдореБрджреНрджреЛрдВ рдХреЛ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝рдирд╛ред

рд╕рдорд╕реНрдпрд╛ рдкреНрд░рдмрдВрдзрди рд╢реИрд▓реА рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдВрджрд░реНрдн - https://www.dabapps.com/blog/sustainable-open-source-management/

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

manjitkumar picture manjitkumar  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jpocentek picture jpocentek  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MadWombat picture MadWombat  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hemanthsp picture hemanthsp  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

macropin picture macropin  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ