Support for creating objects with m2m relations

This commit is contained in:
Fernando Zunino 2011-07-05 02:25:39 -03:00
parent 2dc042f0cf
commit a634d10cbf

View File

@ -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):
""" """
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)