Django-rest-framework: Serializer DateTimeField рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рджрд┐рд╕ре░ 2015  ┬╖  34рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: encode/django-rest-framework

рдореЗрд░реА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ TIME_ZONE = 'Asia/Kolkata' рдФрд░ USE_TZ = True рд╣реИрдВред

рдЬрдм рдореИрдВ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реВрдВ, рддреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдирдП рдмрдирд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓рд╛ +5:30 , рдЬреЛ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рдпреВрдЯреАрд╕реА рдореЗрдВ рд╕рдордп рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рд╕рднреА UTC рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкреАрдЫреЗ рдХреЗ Z ред рд╡рд░реНрддрдорд╛рди рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдкрд░ Django рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреЗрдЧрд╛, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рдЬреЛ TIME_ZONE = 'Asia/Kolkata' рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?

Needs further review

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ USE_TZ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдорд╛рдиреЛрдВ рдХреЛ рдорд╛рдирдХ Django рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

рд╣рд╛рдп @tomchristie ,

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдбреАрдЖрд░рдПрдл рдмрдЧ рд╣реИред
рдЖрдИрдПрдордПрдЪрдУ, рдбреАрдЖрд░рдПрдл рдХрд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЙрдкрдпреЛрдЧ рдЗрд╕реЗ рдбреАрдЬреЗрдВрдЧреЛ рдЯреЗрдореНрдкрд▓реЗрдЯрд┐рдВрдЧ рдЬреИрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдПрдХ django рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЯрд╛рдЗрдордЬрд╝реЛрди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВ drf serializer django рдЯрд╛рдЗрдордЬрд╝реЛрди рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдореНрдорд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рдирдорд╕реНрддреЗ,

fields.py рдореЗрдВ DatetimeField рдХрдХреНрд╖рд╛ рдореЗрдВ рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ Django рдЯрд╛рдЗрдордЬрд╝реЛрди рд╕реЗрдЯрд┐рдВрдЧ рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдп ( to_internal_value() ) рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдореЙрдбрд▓ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

class MyModelSerializer(ModelSerializer):

    class Meta:
        model = MyModel
        depth = 1
        fields = ('some_field', 'my_date_time_field')

рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП my_date_time_field (рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдбреЗрдЯрдЯрд╛рдЗрдордлрд┐рд▓реНрдб рд╣реИ :)) рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ ( to_representation() )ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдВ, рддреЛ Django рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЗрд╡рд▓ рддрднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдорд╛рди рд╕реНрдЯреЛрд░реЗрдЬ рдмреИрдХрдПрдВрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдИрдПрдордПрдЪрдУ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ to_representation() рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
return self.enforce_timezone(value).strftime(output_format)
Django USE_TZ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред

рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрддрд╛ рд╣реВрдВред

рдХрд┐рдЖрдУ
Valentino

@vpistis рдЗрд╕рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреЗрдЦреЗ рдЧрдП рдПрдкреАрдЖрдИ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╣рд▓реБрдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп)

рдЕрдкрдирд╛ TIME_ZONE = 'Asia/Kolkata' рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдХрд▓ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдлрд╝реАрд▓реНрдб, appointment рд╕рд╛рде рдПрдХ рдореЙрдбрд▓ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдПрдВред

рдмрдирд╛рдиреЗ/рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рднреЗрдЬреЗрдВ:

{
    "appointment": "2016-12-19T10:00:00"
}

рдФрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдУ:

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЙрд╕ рд╡рд╕реНрддреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдпрд╛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ:

{
    "appointment": "2016-12-19T04:30:00Z"
}

рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рдпрджрд┐ Z рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ DRF рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ TIME_ZONE рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕рдордп рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЕрдВрдд рдореЗрдВ +5:30 рдЬреЛрдбрд╝рдХрд░, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдорд╛рдиреНрдп рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рдордп рдерд╛)ред рдпрд╣ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рдХреА рдкрд╣реБрдВрдЪ рднреА рдЙрд╕ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрд╡рд░реВрдкрд┐рдд рд╕рдордп рд▓реМрдЯрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐/рд╕реВрдЪреА рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рдг/рдЕрджреНрдпрддрди рдХреЗ рджреМрд░рд╛рди рд╕рдорд╛рди рдереАред

рдЬрдм рдирд┐рд░реНрдорд╛рдг/рдЕрджреНрдпрддрди рдХреЗ рджреМрд░рд╛рди рдкрд┐рдЫрд▓рд╛ Z рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╕рдордпрдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдордп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕рдХрд╛ рднреА рд╕рд╡рд╛рд▓ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рднреЗрдЬрдирд╛:

{
    "appointment": "2016-12-19T04:30:00Z"
}

рд░рд┐рдЯрд░реНрди:

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реВрдЪрд┐рдпреЛрдВ/рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд░рдЦрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпреВрдЯреАрд╕реА рд╕рдордп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕реГрдЬрди/рдЕрдкрдбреЗрдЯ рдХреЗ рджреМрд░рд╛рди рднреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдХрдо рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рдЬреЛ 50/50ish рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдЯрд╛рдЗрдордЬрд╝реЛрди рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рдЕрдкрдирд╛ TIME_ZONE = 'рдПрд╢рд┐рдпрд╛/рдХреЛрд▓рдХрд╛рддрд╛' рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдХрд▓ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдлрд╝реАрд▓реНрдб, рдЕрдкреЙрдЗрдВрдЯрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбрд▓ рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░ рдмрдирд╛рдПрдВред

рдмрдирд╛рдиреЗ/рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рднреЗрдЬреЗрдВ:

{
"рдирд┐рдпреБрдХреНрддрд┐": "2016-12-19T10:00:00"
}
рдФрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдУ:

{
"рдирд┐рдпреБрдХреНрддрд┐": "2016-12-19T10:00:00+5:30"
}
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЙрд╕ рд╡рд╕реНрддреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдпрд╛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ:

{
"рдЕрдкреЙрдЗрдВрдЯрдореЗрдВрдЯ": "2016-12-19T04:30:00Z"
}

рдереИрдВрдХреНрд╕ @ рдЬреЛрдирд╛рдерди-рдЧреЛрд▓реЛрд░реА рдпрд╣ рд╕рдЯреАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред
рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (@ рдЬреЛрдирд╛рдерди-рдЧреЛрд▓реЛрд░реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ :)):

рдбрд┐рдлрд╝реЙрд▓реНрдЯ DATETIME_FORMAT рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ/рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди, рднреЗрдЬреЗрдВ:

{
    "appointment": "2016-12-19T10:00:00"
}

рдФрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдУ:

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

рдпрджрд┐ рдЖрдк рдЙрд╕ рд╡рд╕реНрддреБ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдпрд╛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ:

{
    "appointment": "2016-12-19T10:00:00+5:30"
}

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

рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж @tomchristie

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

DRF 3.4.6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдбрдХреНрд╢рди рд╡реЗрдм рдРрдк рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рд╣реИ:
https://github.com/vpistis/django-rest-framework/commit/be62db9080b19998d4de3a1f651a291d691718f6

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

  • рдмрд╕ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдпрд╛ ...
  • рдЯреЗрд╕реНрдЯ рдХреЗрд╕ + рдлрд┐рдХреНрд╕

рдпрд╣ рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред

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

рдереИрдВрдХреНрд╕

рдпрджрд┐ рдЖрдк рд╡реИрд╢реНрд╡рд┐рдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдпрд╣рд╛рдВ рд╕реНрдерд┐рдд

рдпрджрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк override_settings рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ USE_TZ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдорд╛рдиреЛрдВ рдХреЛ рдорд╛рдирдХ Django рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдирдорд╕реНрддреЗ,
рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╣реИ

class TestDateTimeFieldTimeZone(TestCase):
    """
    Valid and invalid values for `DateTimeField`.
    """
    from django.utils import timezone

    valid_inputs = {
        '2001-01-01 13:00': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        '2001-01-01T13:00': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        '2001-01-01T13:00Z': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        datetime.datetime(2001, 1, 1, 13, 00): datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()),
        datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.UTC()): datetime.datetime(2001, 1, 1, 13, 00,
                                                                                        tzinfo=timezone.get_default_timezone()),
        # Django 1.4 does not support timezone string parsing.
        '2001-01-01T13:00Z': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone())
    }
    invalid_inputs = {}
    outputs = {
        # This is not simple, for now I suppose TIME_ZONE = "Europe/Rome"
        datetime.datetime(2001, 1, 1, 13, 00, tzinfo=timezone.get_default_timezone()): '2001-01-01T13:00:00+01:00',
        datetime.datetime(2001, 1, 1, 13, 00, ): '2001-01-01T13:00:00+01:00',
    }

    field = serializers.DateTimeField()

рдореЗрд░реЗ рдХрд╛рдВрдЯреЗ рдореЗрдВ рдореИрдВ рд╕рд╣реА рд╕рдордп рдХреНрд╖реЗрддреНрд░ my 3.6.2_tz_fix рдореЗрдВ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж :)

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмрдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ drf 3.6.3 рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк "2017-07-12 14:26: 00-06" рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореБрдЭреЗ рдбрд╛рдХрд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдпрд╣ "рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк" рдорд┐рд▓рддрд╛ рд╣реИред : "2017-07-12T20:26:00Z"ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ -06 рдШрдВрдЯреЗ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред

рдореЗрд░реА django рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЯрд╛рдЗрдордЬрд╝реЛрди TIME_ZONE = str(get_localzone()) рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tzlocal рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рддреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдЯрд╛рдЗрдордЬрд╝реЛрди рд╕реЗрдЯ рд╣реИред

рдореИрдВ рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдореЙрдбрд▓рд╕реЗрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

class SnapshotSerializer(serializers.ModelSerializer):
    class Meta:
        model = Snapshot
        resource_name = 'snapshot' 
        read_only_fields = ('id',)
        fields = ('id', 'timestamp', 'snapshot')

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?

рдмрдВрдж рдирд╣реАрдВ, рдпрд╣ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ :)
рд▓рд╛рд▓ "рдмрдВрдж рдмрдЯрди" рдЬреЛ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕рдВрджрд░реНрдн рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
... рдФрд░ рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, "рдмрдЧ" рдЕрднреА рднреА рд╣реИ ;(
рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ 3.6.3 рд╕реЗ 3.6.4 рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

рдУрд╣ рдареАрдХред рд╢реБрдХреНрд░рд┐рдпрд╛!

12 рдЬреБрд▓рд╛рдИ 2017 рдХреЛ рд╢рд╛рдо 5:10 рдмрдЬреЗ, "рд╡реИрд▓реЗрдВрдЯрд┐рдиреЛ рдкрд┐рд╕реНрдЯрд┐рд╕" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдмрдВрдж рдирд╣реАрдВ, рдпрд╣ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ :)
рд▓рд╛рд▓ "рдмрдВрдж рдмрдЯрди" рдЬреЛ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕рдВрджрд░реНрдн рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
... рдФрд░ рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, "рдмрдЧ" рдЕрднреА рднреА рд╣реИ ;(
рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ 3.6.3 рд╕реЗ 3.6.4 рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/encode/django-rest-framework/issues/3732#issuecomment-314923582 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AIMBTcx-6PPbi_SOqeLCjeWV1Rb59-Ohks5sNVJ0gaJpZM4G0aRE
.

рдирдорд╕реНрддреЗ,

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореВрд▓ рдкреНрд░рд╢реНрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдбреАрдЖрд░рдПрдл рдХреЛ https://docs.djangoproject.com/en/1.11/ref/utils/#django рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдЯрд╛рдЗрдордЬрд╝реЛрди рдУрд╡рд░рд░рд╛рдЗрдб рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯрд╛рдЗрдордЬрд╝реЛрди рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рдмреЗрд╡рдХреВрдл рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдЙрди рдбреЗрдЯрд╛рдЯрд╛рдЗрдореНрд╕ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЯрд╛рдЗрдордЬрд╝реЛрди рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ../rest_framework/fields.py рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯрд╛рдЗрдордЬрд╝реЛрди рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдпрд╛рдиреА django рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ:

    def enforce_timezone(self, value):
        field_timezone = getattr(self, 'timezone', self.default_timezone())

        if (field_timezone is not None) and not timezone.is_aware(value):
            try:
                return timezone.make_aware(value, field_timezone)

[...]

    def default_timezone(self):
        return timezone.get_default_timezone() if settings.USE_TZ else None

рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ timezone.get_current_timezone() рдХреЛ рд╡рд░реАрдпрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗ рдУрд╡рд░рд░рд╛рдЗрдб рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ?

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

рдпрджрд┐ рд╣рдо рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдПрдХ рдкреАрдЖрд░ рджреЗрдЦреЗрдВрдЧреЗред

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

рд▓реЗрдХрд┐рди рд╣рд╛рдВ, рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рд╕рдВрдЧрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред (рдХреНрдпрд╛ рдореИрдВрдиреЗ рдкреАрдЖрд░ рд╡реЗрд▓рдХрдо рдХрд╛ рдЬрд┐рдХреНрд░ рдХрд┐рдпрд╛? )

carltongibson/django-filter#750 рдпрд╣рд╛рдВ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдбреАрдЖрд░рдПрдл рдкрд░ django-filter рдХреЗ рдЯрд╛рдЗрдордЬрд╝реЛрди рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП 750 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░реА рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдореЗрд░реЗ psql рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕рд╣реА рд╣реИ рдФрд░ Django рд╕рд╣реА рдЯрд╛рдЗрдордЬрд╝реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдХреНрдпрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ DRF рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИ?

рд╣рд╛рдп @michaelaelise - рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ (рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕):

  1. рд╡реЗ рдЯрд╛рдЗрдордЬрд╝реЛрди рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВред (рдпрд╣ рдореЗрд░реА рдХрд┐рддрд╛рдм рдореЗрдВ рдПрдХ рдмреБрд░рд╛ рдХрджрдо рд╣реИред)
  2. рд╕рд░реНрд╡рд░ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ +5:30 )
  3. рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ, рдЬрдм рдЖрдк рдЗрд╕реЗ рд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдпреВрдЯреАрд╕реА ( Z , "рдЬрд╝реБрд▓реБ" рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред

рдЗрд╕ рдзрд╛рд░рдгрд╛ рдкрд░ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ

рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 2 рдФрд░ 3 рдХрд╛ рдкреНрд░рд╛рд░реВрдк рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? (рднрд▓реЗ рд╣реА рдПрдХ рдЧреНрд░рд╛рд╣рдХ, рд╕рд╣реА рдврдВрдЧ рд╕реЗ, рд╕рдордХрдХреНрд╖ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред)

рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред

  • рдпрд╣рд╛рдВ рдХреЛрдИ рддрд░реНрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред

    • рдпреЗ рдПрдХ рд╣реА рд╕рдордп рд╣реИрдВ: "2016-12-19T10:00:00+5:30" рдФрд░ "2016-12-19T04:30:00Z" - рдХреБрдЫ рд╣рдж рддрдХ, рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ?

  • рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордп рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
  • рдЯрд┐рдХрдЯ 2 рд╕рд╛рд▓ рдкреБрд░рд╛рдирд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдиреЗ рдкреАрдЖрд░ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХреА рд╣реИред

рдореИрдВ рдПрдХ рдкреАрдЖрд░ рдХреЛ рджреЗрдЦрдХрд░ рдЦреБрд╢ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдПрдХ _рдУрдкрди рдЗрд╢реНрдпреВ_ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

рдПрдХ рдЕрдВрддрд┐рдо рдмрд╛рддред
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ "2016-12-19T10:00:00+5:30" рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдорддрджрд╛рди рдЙрдкрдХрд░рдг рд╣реИрдВред
рдХреНрдпрд╛ рдпрд╣ "RETURN_DATETIME_WITH_TIMEZONE" рд╕реЗрдЯрд┐рдВрдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ?

рд╣рдо рдПрдЬ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ django/drf рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддреЛ рдбрд╛рд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╕рднреА рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╡рдХреВрдл рд╣реИ рдпрд╛ рдирд╣реАрдВ рдХреНрдпреЛрдВрдХрд┐ рдПрдЬ рдбрд┐рд╡рд╛рдЗрд╕ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕ рдлрд╝реАрд▓реНрдб рд╣рдореЗрд╢рд╛ рдЙрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рд╣реЛрдЧрд╛ред

рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдХреНрд▓рд╛рдЙрдб рд╕рд░реНрд╡рд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╢рд╛рдпрдж рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд╛рдо рдХреЛ django/drf рд╕реЗ рдХреНрд▓рд╛рдЙрдб рдРрдк рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПред

USE_TZ рдорд╛рдирддреЗ рд╣реБрдП, DRF рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рджрд┐рдирд╛рдВрдХ рд╕рдордп рд▓реМрдЯрд╛ рд░рд╣рд╛ рд╣реИред рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣реА рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдЪрд╛рд╣рд┐рдПред

рдпрд╣рд╛рдВ рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рд╣реА рдбреАрдЯреА рдХреЛ рдПрдХ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред (рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рд╡рд╣реА рд╕рдордп рд╣реИрдВред)

@carltongibson

рдпрд╣рд╛рдВ рдХреЛрдИ рддрд░реНрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред
рдпреЗ рд╡рд╣реА рд╕рдордп рд╣реИрдВ: "2016-12-19T10:00:00+5:30" рдФрд░ "2016-12-19T04:30:00Z" - рдХреБрдЫ рд╣рдж рддрдХ, рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ?

рдЖрдИрдПрдордПрдЪрдУ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рд▓реМрдЯрд╛рдИ рдЧрдИ рд╕реНрдЯреНрд░рд┐рдВрдЧ!
рдореИрдВ Django рд╕рдордп рдХреНрд╖реЗрддреНрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд╣реА рд╕рдордп "2016-12-19T10:00:00+5:30" рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд╣рдордиреЗ рдЙрдореНрдореАрдж рдХреА рдереА, рд▓реЗрдХрд┐рди рдбреАрдЖрд░рдПрдл рдирд╣реАрдВред рдбреАрдЖрд░рдПрдл рд╡рд╛рдкрд╕реА "2016-12-19T04:30:00Z" ред
рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ, рдЬреЛ рдореЗрд░реЗ рдЖрд░рдИрдПрд╕рдЯреА рдПрдкрд┐рд╕ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдХреЛрдИ рд╕рдордп рд░реВрдкрд╛рдВрддрд░рдг рдпрд╛ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдбреАрдЖрд░рдПрдл рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо Django рдЯреЗрдореНрдкрд▓реЗрдЯ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛" рдХреЗ рд╕рдорд╛рди рд╣реИ: рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗрд╡рд▓ рдЗрд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

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

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

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

рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдХрдЪреНрдЪреЗ рддрд╛рд░ рдХрд╛ рд╕реЗрд╡рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ рдпрд╣рд╛рдВ рдкреВрд░реА рдирд╣реАрдВ рд╣реЛрдВрдЧреАред (рд▓реЗрдХрд┐рди рдРрд╕рд╛ рди рдХрд░реЗрдВ: рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдордиреЗ UNIX рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рднреЗрдЬреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрди рдХрдЪреНрдЪреЗ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдЙрдЪрд┐рдд рджрд┐рдирд╛рдВрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ, рдЬреЛ рднреА рдЖрдкрдХреА рдХреНрд▓рд╛рдЗрдВрдЯ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИред)

рдореИрдВ рдЗрд╕ рдкрд░ рдкреАрдЖрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрд╢ рд╣реВрдВред (рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ!)

рд▓реЗрдХрд┐рди рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рд╣реБрдП рд▓рдЧрднрдЧ рджреЛ рд╕рд╛рд▓ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдиреМ рдорд╣реАрдиреЗ рдмрд╛рдж (рдЖрдкрдХреА, рдПрдХ рд╕рд╛рд▓ рдмрд╛рдж)ред рдХрд┐рд╕реА рдиреЗ рд╣рдореЗрдВ рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рдорд▓рд╛ рднреА рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдРрд╕реЗ рдореЗрдВ рдЗрд╕реЗ рд╕рдордп рджреЗрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

(рдЗрд╕ рддрд░рд╣ рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдХрднреА рдЖрддрд╛ рд╣реИ рддреЛ рд╣рдо рдПрдХ рдкреАрдЖрд░ рд▓реЗрдВрдЧреЗ)

рд╣рд╛рдп рд╕рдм, рдЗрд╕реЗ #5408 рджреНрд╡рд╛рд░рд╛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢рд╛рдЦрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╢рд╛рдирджрд╛рд░ рд╣реЛрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдлрд┐рд░ рд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

рдЬрдм рдореИрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ TZ рдХреЛ UTC рд╕реЗ рдпреВрд░реЛрдк/рдПрдореНрд╕реНрдЯрд░реНрдбрдо рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рддреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ DRF рдбрд┐рдлрд╝реЙрд▓реНрдЯ TZ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░рдордмрджреНрдз рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рдорд╕реНрдпрд╛ рдкрд░реАрдХреНрд╖рдг/рдлрд╝реИрдХреНрдЯрд░реА рд╕реЗрдЯрдЕрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереАред


рдиреАрдЪреЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯрдЕрдкред

рдЖрджрд░реНрд╢

class Something(StampedModelMixin):
    MIN_VALUE = 1
    MAX_VALUE = 500

    id = models.BigAutoField(primary_key=True)  # pylint: disable=blacklisted-name
    product_id = models.BigIntegerField(db_index=True)
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    percentage = models.IntegerField()
    enabled = models.IntegerField()

рдлрд╝реИрдХреНрдЯрд░реА

class SomethingFactory(factory.django.DjangoModelFactory):
    """ Base Factory to create records for Something

    """
    start_time = factory.Faker('date_time', tzinfo=get_default_timezone())
    end_time = factory.Faker('date_time', tzinfo=get_default_timezone())
    percentage = factory.Faker('random_int', min=1, max=500)
    enabled = factory.Faker('random_element', elements=[0, 1])

    class Meta:  # pylint: disable=missing-docstring
        model = Something

рдЕрдзреНрдпрд╛рдп рдкрд░реАрдХреНрд╖рд╛

class TestSomething:
    def test__get__empty(self):
        # preparation of data
        series = SeriesFactory.create(product_id=2)
        SomethingFactory.create_batch(3, product_id=1)

        # prepare request params
        url = reverse('series-somethings', kwargs={'pk': series.pk})

        # call the endpoint
        response = self.client.get(url)

        # asserts
        assert response.data == []

    def test__get__single(self):
        # preparation of data
        series = SeriesFactory.create(product_id=1)
        old_somethings = SomethingFactory.create_batch(1, product_id=1)

        # prepare request params
        url = reverse('series-somethings', kwargs={'pk': series.pk})

        # call the endpoint
        response = self.client.get(url)

        # asserts
        assert SomethingSerializer(old_somethings, many=True).data == response.data

рджреГрд╢реНрдп

class SomethingElseView(APILogMixin, ModelViewSet):
    @action(detail=True, methods=['get'])
    def somethings(self, request, pk=None):
        """ GET endpoint for Somethings

        .. seealso:: :func:`rest_framework.decorators.action`
        """
        otherthings = self.get_object()
        something_qs = Something.objects.all()
        something_qs = something_qs.filter(product_id=otherthings.product_id)
        serializer = self.something_serializer_class(something_qs, many=True)
        return Response(serializer.data)

serializer

class SomethingSerializer(serializers.ModelSerializer):

    class Meta:
        model = Something
        list_serializer_class = SomethingListSerializer
        fields = '__all__'
        extra_kwargs = {
            'percentage': {'min_value': Something.MIN_VALUE,
                           'max_value': Something.MAX_VALUE}
        }
        read_only_fields = ('id',
                            'ts_activated',
                            'ts_created',
                            'ts_updated')

рдЯреЗрд╕реНрдЯ рдЖрдИрдкреАрдбреАрдмреА рдкрд░рд┐рдгрд╛рдо

ipdb> old_somethings
[{'product_id': 1, 'start_time': datetime.datetime(2011, 7, 13, 1, 10, 33, tzinfo=<DstTzInfo 'Europe/Amsterdam' LMT+0:20:00 STD>), 'end_time': datetime.datetime(2003, 3, 10, 9, 31, tzinfo=<DstTzInfo 'Europe/Amsterdam' LMT+0:20:00 STD>), 'percentage': 103, 'enabled': 0}]
ipdb> response.data
[OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:16:33'), ('ts_updated', '2019-02-27 14:16:33'), ('product_id', 1), ('start_time', '2011-07-13 02:50:33'), ('end_time', '2003-03-10 10:11:00'), ('percentage', 103), ('enabled', 0)])]

рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо

E       AssertionError: assert [OrderedDict(...nabled', 0)])] == [OrderedDict([...nabled', 0)])]
E         At index 0 diff: OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 01:10:33'), ('end_time', '2003-03-10 09:31:00'), ('percentage', 103), ('enabled', 0)]) != OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 02:50:33'), ('end_time', '2003-03-10 10:11:00'), ('percentage', 103), ('enabled', 0)])
E         Full diff:
E         - [OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 01:10:33'), ('end_time', '2003-03-10 09:31:00'), ('percentage', 103), ('enabled', 0)])]
E         ?                                                                                                                                                       ^^^^^^^^^^                          ^^^^^^^^^^^
E         + [OrderedDict([('id', 1), ('ts_created', '2019-02-27 14:38:15'), ('ts_updated', '2019-02-27 14:38:15'), ('product_id', 1), ('start_time', '2011-07-13 02:50:33'), ('end_time', '2003-03-10 10:11:00'), ('percentage', 103), ('enabled', 0)])]
E         ?

рдвреЗрд░:

Django==2.0.10
djangorestframework==3.9.0
factory-boy==2.11.1
Faker==0.8.18
pytz==2018.9

рд╣рд╛рдп @ diegueus9 - рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдк рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ рдирдХрд▓реА рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд┐рд╕реА рджреГрд╢реНрдп рдХреЗ рдкреНрд░рддрд┐рд╕рд╛рдж рдбреЗрдЯрд╛ рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдХреНрдпрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рдорд╛рди рд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

assert SomethingSerializer(old_somethings, many=True).data == {'blah':'blah'}

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

    for old_something in old_somethings:
        old_something.refresh_from_db()

рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рднреА рдЙрд╕реА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддрд╛ рд╣реИ?

рд╣рд╛рдп @ diegueus9 , рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ - рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ details рдЯреИрдЧ рдореЗрдВ рдЫреБрдкрд╛рдпрд╛ рд╣реИред

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

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

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

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

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

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

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