рдореЗрд░реА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ TIME_ZONE = 'Asia/Kolkata'
рдФрд░ USE_TZ = True
рд╣реИрдВред
рдЬрдм рдореИрдВ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реВрдВ, рддреЛ рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдирдП рдмрдирд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓рд╛ +5:30
, рдЬреЛ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛рдмреЗрд╕ рдпреВрдЯреАрд╕реА рдореЗрдВ рд╕рдордп рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рд╕рднреА UTC рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкреАрдЫреЗ рдХреЗ Z
ред рд╡рд░реНрддрдорд╛рди рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдкрд░ Django рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреЗрдЧрд╛, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рдЬреЛ TIME_ZONE = 'Asia/Kolkata'
рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред
рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреВрд▓ рд░рд╣рд╛ рд╣реВрдБ?
рдореИрдВрдиреЗ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдкреВрдЫрд╛ рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрддреНрдд рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ-рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рдж (рдпрд╛рдиреА рдмрдирд╛рдиреЗ рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж)ред 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 - рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ (рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕):
+5:30
)Z
, "рдЬрд╝реБрд▓реБ" рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИредрдЗрд╕ рдзрд╛рд░рдгрд╛ рдкрд░ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ
рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 2 рдФрд░ 3 рдХрд╛ рдкреНрд░рд╛рд░реВрдк рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? (рднрд▓реЗ рд╣реА рдПрдХ рдЧреНрд░рд╛рд╣рдХ, рд╕рд╣реА рдврдВрдЧ рд╕реЗ, рд╕рдордХрдХреНрд╖ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред)
рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред
"2016-12-19T10:00:00+5:30"
рдФрд░ "2016-12-19T04:30:00Z"
- рдХреБрдЫ рд╣рдж рддрдХ, рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ?рдореИрдВ рдПрдХ рдкреАрдЖрд░ рдХреЛ рджреЗрдЦрдХрд░ рдЦреБрд╢ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдПрдХ _рдУрдкрди рдЗрд╢реНрдпреВ_ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдУрд╣, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдЗрд╕ рдЕрдВрдХ рдореЗрдВ рдореЗрд░реА рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ "рдЬреЗрдб" рдХрд╛ рдорддрд▓рдм рдерд╛ред
рддреЛ рдбреАрдЖрд░рдПрдл рдпреВрдЖрдИ/рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЬрд╛рдЧрд░реВрдХ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдХреЛ рдпреВрдЯреАрд╕реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ?
рдЙрд╕ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдПрдХ рдЕрдВрддрд┐рдо рдмрд╛рддред
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ "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
рдЯреИрдЧ рдореЗрдВ рдЫреБрдкрд╛рдпрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рднреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐
USE_TZ
рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдорд╛рдиреЛрдВ рдХреЛ рдорд╛рдирдХ Django рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред