mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-03 20:10:10 +03:00
Fixed the reversed relation for virtual fields (generic foreign keys).
This commit is contained in:
parent
7750138643
commit
4160bbcf72
|
@ -919,6 +919,7 @@ class ModelSerializer(Serializer):
|
||||||
Restore the model instance.
|
Restore the model instance.
|
||||||
"""
|
"""
|
||||||
m2m_data = {}
|
m2m_data = {}
|
||||||
|
virtual_m2m_data = {}
|
||||||
related_data = {}
|
related_data = {}
|
||||||
nested_forward_relations = {}
|
nested_forward_relations = {}
|
||||||
meta = self.opts.model._meta
|
meta = self.opts.model._meta
|
||||||
|
@ -936,10 +937,16 @@ class ModelSerializer(Serializer):
|
||||||
m2m_data[field_name] = attrs.pop(field_name)
|
m2m_data[field_name] = attrs.pop(field_name)
|
||||||
|
|
||||||
# Forward m2m relations
|
# Forward m2m relations
|
||||||
for field in meta.many_to_many + meta.virtual_fields:
|
for field in meta.many_to_many:
|
||||||
if field.name in attrs:
|
if field.name in attrs:
|
||||||
m2m_data[field.name] = attrs.pop(field.name)
|
m2m_data[field.name] = attrs.pop(field.name)
|
||||||
|
|
||||||
|
# Virtual m2m relations
|
||||||
|
# This is mostly for GenericRelations
|
||||||
|
for field in meta.virtual_fields:
|
||||||
|
if field.name in attrs:
|
||||||
|
virtual_m2m_data[field.name] = attrs.pop(field.name)
|
||||||
|
|
||||||
# Nested forward relations - These need to be marked so we can save
|
# Nested forward relations - These need to be marked so we can save
|
||||||
# them before saving the parent model instance.
|
# them before saving the parent model instance.
|
||||||
for field_name in attrs.keys():
|
for field_name in attrs.keys():
|
||||||
|
@ -964,6 +971,7 @@ class ModelSerializer(Serializer):
|
||||||
# at the point of save.
|
# at the point of save.
|
||||||
instance._related_data = related_data
|
instance._related_data = related_data
|
||||||
instance._m2m_data = m2m_data
|
instance._m2m_data = m2m_data
|
||||||
|
instance._virtual_m2m_data = virtual_m2m_data
|
||||||
instance._nested_forward_relations = nested_forward_relations
|
instance._nested_forward_relations = nested_forward_relations
|
||||||
|
|
||||||
return instance
|
return instance
|
||||||
|
@ -992,10 +1000,18 @@ class ModelSerializer(Serializer):
|
||||||
|
|
||||||
if getattr(obj, '_m2m_data', None):
|
if getattr(obj, '_m2m_data', None):
|
||||||
for accessor_name, object_list in obj._m2m_data.items():
|
for accessor_name, object_list in obj._m2m_data.items():
|
||||||
|
# We need to save m2m data before linking the objects together
|
||||||
[self.save_object(o) for o in object_list]
|
[self.save_object(o) for o in object_list]
|
||||||
setattr(obj, accessor_name, object_list)
|
setattr(obj, accessor_name, object_list)
|
||||||
del(obj._m2m_data)
|
del(obj._m2m_data)
|
||||||
|
|
||||||
|
if getattr(obj, '_virtual_m2m_data', None):
|
||||||
|
for accessor_name, object_list in obj._virtual_m2m_data.items():
|
||||||
|
# In case of GenericRelation, we have a FK as constraint
|
||||||
|
setattr(obj, accessor_name, object_list)
|
||||||
|
[self.save_object(o) for o in object_list]
|
||||||
|
del(obj._m2m_data)
|
||||||
|
|
||||||
if getattr(obj, '_related_data', None):
|
if getattr(obj, '_related_data', None):
|
||||||
related_fields = dict([
|
related_fields = dict([
|
||||||
(field.get_accessor_name(), field)
|
(field.get_accessor_name(), field)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user