Commit a634d10c by Fernando Zunino

Support for creating objects with m2m relations

parent 2dc042f0
...@@ -5,7 +5,7 @@ classes that can be added to a `View`. ...@@ -5,7 +5,7 @@ classes that can be added to a `View`.
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from django.db.models.fields.related import RelatedField from django.db.models.fields.related import ForeignKey
from django.http import HttpResponse from django.http import HttpResponse
from django.http.multipartparser import LimitBytes from django.http.multipartparser import LimitBytes
...@@ -508,21 +508,35 @@ class CreateModelMixin(object): ...@@ -508,21 +508,35 @@ class CreateModelMixin(object):
""" """
Behavior to create a `model` instance on POST requests Behavior to create a `model` instance on POST requests
""" """
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
model = self.resource.model model = self.resource.model
# translated 'related_field' kwargs into 'related_field_id' # Copy the dict to keep self.CONTENT intact
for related_name in [field.name for field in model._meta.fields if isinstance(field, RelatedField)]: content = dict(self.CONTENT)
if kwargs.has_key(related_name): m2m_data = {}
kwargs[related_name + '_id'] = kwargs[related_name]
del kwargs[related_name] for field in model._meta.fields:
if isinstance(field, ForeignKey) and kwargs.has_key(field.name):
# translate 'related_field' kwargs into 'related_field_id'
kwargs[field.name + '_id'] = kwargs[field.name]
del kwargs[field.name]
for field in model._meta.many_to_many:
if content.has_key(field.name):
m2m_data[field.name] = content[field.name]
del content[field.name]
all_kw_args = dict(content.items() + kwargs.items())
all_kw_args = dict(self.CONTENT.items() + kwargs.items())
if args: if args:
instance = model(pk=args[-1], **all_kw_args) instance = model(pk=args[-1], **all_kw_args)
else: else:
instance = model(**all_kw_args) instance = model(**all_kw_args)
instance.save() instance.save()
for fieldname in m2m_data:
getattr(instance, fieldname).add(*m2m_data[fieldname])
headers = {} headers = {}
if hasattr(instance, 'get_absolute_url'): if hasattr(instance, 'get_absolute_url'):
headers['Location'] = self.resource(self).url(instance) headers['Location'] = self.resource(self).url(instance)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment