Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
D
django
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
django
Commits
73f7d175
Kaydet (Commit)
73f7d175
authored
Mar 20, 2018
tarafından
Peter Inglesby
Kaydeden (comit)
Tim Graham
Mar 20, 2018
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Extracted deserialize fk/m2m functions from Deserializer.
In preparation for handling forward references (refs #26291).
üst
a0c03c62
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
55 additions
and
40 deletions
+55
-40
base.py
django/core/serializers/base.py
+46
-0
python.py
django/core/serializers/python.py
+9
-40
No files found.
django/core/serializers/base.py
Dosyayı görüntüle @
73f7d175
...
...
@@ -28,6 +28,13 @@ class DeserializationError(Exception):
return
cls
(
"
%
s: (
%
s:pk=
%
s) field_value was '
%
s'"
%
(
original_exc
,
model
,
fk
,
field_value
))
class
M2MDeserializationError
(
Exception
):
"""Something bad happened during deserialization of a ManyToManyField."""
def
__init__
(
self
,
original_exc
,
pk
):
self
.
original_exc
=
original_exc
self
.
pk
=
pk
class
ProgressBar
:
progress_width
=
75
...
...
@@ -235,3 +242,42 @@ def build_instance(Model, data, db):
except
Model
.
DoesNotExist
:
pass
return
obj
def
deserialize_m2m_values
(
field
,
field_value
,
using
):
model
=
field
.
remote_field
.
model
if
hasattr
(
model
.
_default_manager
,
'get_by_natural_key'
):
def
m2m_convert
(
value
):
if
hasattr
(
value
,
'__iter__'
)
and
not
isinstance
(
value
,
str
):
return
model
.
_default_manager
.
db_manager
(
using
)
.
get_by_natural_key
(
*
value
)
.
pk
else
:
return
model
.
_meta
.
pk
.
to_python
(
value
)
else
:
def
m2m_convert
(
v
):
return
model
.
_meta
.
pk
.
to_python
(
v
)
try
:
values
=
[]
for
pk
in
field_value
:
values
.
append
(
m2m_convert
(
pk
))
return
values
except
Exception
as
e
:
raise
M2MDeserializationError
(
e
,
pk
)
def
deserialize_fk_value
(
field
,
field_value
,
using
):
if
field_value
is
None
:
return
None
model
=
field
.
remote_field
.
model
default_manager
=
model
.
_default_manager
field_name
=
field
.
remote_field
.
field_name
if
(
hasattr
(
default_manager
,
'get_by_natural_key'
)
and
hasattr
(
field_value
,
'__iter__'
)
and
not
isinstance
(
field_value
,
str
)):
obj
=
default_manager
.
db_manager
(
using
)
.
get_by_natural_key
(
*
field_value
)
value
=
getattr
(
obj
,
field_name
)
# If this is a natural foreign key to an object that has a FK/O2O as
# the foreign key, use the FK value.
if
model
.
_meta
.
pk
.
remote_field
:
value
=
value
.
pk
return
value
return
model
.
_meta
.
get_field
(
field_name
)
.
to_python
(
field_value
)
django/core/serializers/python.py
Dosyayı görüntüle @
73f7d175
...
...
@@ -117,49 +117,18 @@ def Deserializer(object_list, *, using=DEFAULT_DB_ALIAS, ignorenonexistent=False
# Handle M2M relations
if
field
.
remote_field
and
isinstance
(
field
.
remote_field
,
models
.
ManyToManyRel
):
model
=
field
.
remote_field
.
model
if
hasattr
(
model
.
_default_manager
,
'get_by_natural_key'
):
def
m2m_convert
(
value
):
if
hasattr
(
value
,
'__iter__'
)
and
not
isinstance
(
value
,
str
):
return
model
.
_default_manager
.
db_manager
(
using
)
.
get_by_natural_key
(
*
value
)
.
pk
else
:
return
model
.
_meta
.
pk
.
to_python
(
value
)
else
:
def
m2m_convert
(
v
):
return
model
.
_meta
.
pk
.
to_python
(
v
)
try
:
m2m_data
[
field
.
name
]
=
[]
for
pk
in
field_value
:
m2m_data
[
field
.
name
]
.
append
(
m2m_convert
(
pk
))
except
Exception
as
e
:
raise
base
.
DeserializationError
.
WithData
(
e
,
d
[
'model'
],
d
.
get
(
'pk'
),
pk
)
values
=
base
.
deserialize_m2m_values
(
field
,
field_value
,
using
)
except
base
.
M2MDeserializationError
as
e
:
raise
base
.
DeserializationError
.
WithData
(
e
.
original_exc
,
d
[
'model'
],
d
.
get
(
'pk'
),
e
.
pk
)
m2m_data
[
field
.
name
]
=
values
# Handle FK fields
elif
field
.
remote_field
and
isinstance
(
field
.
remote_field
,
models
.
ManyToOneRel
):
model
=
field
.
remote_field
.
model
if
field_value
is
not
None
:
try
:
default_manager
=
model
.
_default_manager
field_name
=
field
.
remote_field
.
field_name
if
hasattr
(
default_manager
,
'get_by_natural_key'
):
if
hasattr
(
field_value
,
'__iter__'
)
and
not
isinstance
(
field_value
,
str
):
obj
=
default_manager
.
db_manager
(
using
)
.
get_by_natural_key
(
*
field_value
)
value
=
getattr
(
obj
,
field
.
remote_field
.
field_name
)
# If this is a natural foreign key to an object that
# has a FK/O2O as the foreign key, use the FK value
if
model
.
_meta
.
pk
.
remote_field
:
value
=
value
.
pk
else
:
value
=
model
.
_meta
.
get_field
(
field_name
)
.
to_python
(
field_value
)
data
[
field
.
attname
]
=
value
else
:
data
[
field
.
attname
]
=
model
.
_meta
.
get_field
(
field_name
)
.
to_python
(
field_value
)
except
Exception
as
e
:
raise
base
.
DeserializationError
.
WithData
(
e
,
d
[
'model'
],
d
.
get
(
'pk'
),
field_value
)
else
:
data
[
field
.
attname
]
=
None
try
:
value
=
base
.
deserialize_fk_value
(
field
,
field_value
,
using
)
except
Exception
as
e
:
raise
base
.
DeserializationError
.
WithData
(
e
,
d
[
'model'
],
d
.
get
(
'pk'
),
field_value
)
data
[
field
.
attname
]
=
value
# Handle all other fields
else
:
try
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment