2012-06-27 6 views
1

tastypie를 사용하여 사용자 등록을 구현하려고하는데 모든 것이 잘 작동하지만 obj_create 메소드를 사용하여 사용자가 이미 존재하는지 여부를 확인하려고 할 때 아무 것도 일어나지 않습니다 ... tastypie에서 호출하는 방법, 자동으로 호출됩니까?obj_create가 tastypie에서 작동하지 않는다

from _mysql_exceptions import IntegrityError 
from django.db.models.query_utils import Q 
from tastypie.authorization import Authorization 
from django.contrib.auth.models import User 
from tastypie.authentication import BasicAuthentication 
from tastypie import fields 
from tastypie.exceptions import BadRequest 
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS 
from tastypie.validation import Validation 
from apps.eUser.models import UserProfile 

class ProfileResource(ModelResource): 
    username = fields.CharField(attribute='user__username', readonly=True) 
    id = fields.CharField(attribute='id') 
    class Meta: 
      queryset =UserProfile.objects.select_related('User') 
      resource_name = 'profile' 
      fields = ['id'] 

class UserResource(ModelResource): 
    class Meta: 
     object_class = User 
     queryset = User.objects.all() 
     resource_name = 'user' 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     #excludes = ['email', 'password', 'is_active', 'is_staff', 'is_superuser'] 
     filtering = { 
     } 

class CreateUserResource(ModelResource): 
    class Meta: 
     allowed_methods = ['post'] 
     object_class = User 
     #authentication = Authentication() 
     authorization = Authorization() 
     resource_name = 'register' 

     include_resource_uri = False 
     fields = ['username','password','email'] 

    def obj_create(self, bundle, request=None, **kwargs): 
    try: 
     bundle = super(CreateUserResource, self).obj_create(bundle, request, **kwargs) 
    except IntegrityError: 
     raise BadRequest('That username already exists') 
    return bundle 

답변

1

UserResource 만 작성하면됩니다.

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     excludes = ['id','email', 'password', 'is_active', 'is_staff', 'is_superuser'] 
     list_allowed_methods = ['post'] 
     detail_allowed_methods = ['get'] 
     default_format = "application/json" 
     filtering = { 
      'username': ALL, 
     } 
     authorization= Authorization() 

def obj_create(self, bundle, request = None, **kwargs): 
    bundle.obj = self._meta.object_class() 
    for key, value in kwargs.items(): 
     setattr(bundle.obj, key, value) 
    bundle = self.full_hydrate(bundle) 

    self.is_valid(bundle,request) 

    if bundle.errors: 
     self.error_response(bundle.errors, request) 

    # Save FKs just in case. 
    self.save_related(bundle) 

    obj = None 
    try: 
     obj = self.obj_get(request, username=bundle.obj.username) # here it checks withe username is already exists or not 
    except self._meta.object_class.DoesNotExist: 
     pass 

    # if user already found then just build the bundle else it will create the new user 
    if obj: 
     bundle = self.build_bundle(obj=obj, request=request) 
    else: 
     # Save parent 
     bundle.obj.save() 
     # Now pick up the M2M bits. 
     m2m_bundle = self.hydrate_m2m(bundle) 
     self.save_m2m(m2m_bundle) 

    return bundle 

희망 하시겠습니까?

1

object_create에서 유효성을 검사하는 대신 validation을 사용할 수 있습니다. FormValidation은 모델 양식에 대한 입력을 확인합니다. 예 :

class UserResource(ModelResource): 
    class Meta: 
     object_class = User 
     queryset = User.objects.all() 
     resource_name = 'user' 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     #excludes = ['email', 'password', 'is_active', 'is_staff', 'is_superuser'] 
     filtering = {} 
     validation = FormValidation(form_class=AddUser) 
관련 문제