2012-05-15 4 views
6

UserResource 및 UserProfileResource를 생성하고 있습니다. 새 사용자를 만들면 내 userprofile 데이터베이스 테이블도 업데이트되는 것을 볼 수 있습니다. 어느 것이 좋니. 나는 사용자가 GET 때 나는 오류가 말을 얻을 :Tastypie foreignkey가 null로 설정되었습니다.

The model '' has an empty attribute 'profile' and doesn't allow a null value. 

내 코드 :

resources.py

class UserProfileResource(ModelResource): 
    home_address = fields.CharField(attribute='home_address') 
    user = fields.ToManyField('resources.UserResource', attribute='user', related_name='profile') 
    class Meta: 
     queryset = UserProfile.objects.all() 
     resource_name = 'profile' 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     fields = ['home_address'] 
     authorization = Authorization() 
     include_resource_uri = False 
     include_absolute_url = False 

class UserResource(ModelResource): 
    profile = fields.ToOneField('resources.UserProfileResource', attribute = 'profile', related_name='user', full=True) 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     fields = ['username'] 
     filtering = { 
       'username': ALL, 
       } 
     authorization = Authorization() 

    def obj_create(self, bundle, request=None, **kwargs): 
     try: 
      bundle = super(UserResource, self).obj_create(bundle, request, **kwargs) 
      bundle.obj.set_password(bundle.data.get('password')) 
      bundle.obj.save() 
     except IntegrityError: 
      raise BadRequest('IntegrityError') 
     return bundle 

models.py

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    home_address = models.TextField() 

누구나 어떤 아이디어? johnoc

답변

15

많은 검색을 마침내 나는 이에 대한 대답을 얻었습니다.

models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    home_address = models.TextField() 

resources.py이 작동

class UserProfileResource(ModelResource): 
    class Meta: 
     queryset = UserProfile.objects.all() 
     resource_name = 'profile' 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     fields = ['home_address'] 
     authorization = Authorization() 
     include_resource_uri = False 
     include_absolute_url = False 

class UserResource(ModelResource): 
    profile = fields.ToOneField('resources.UserProfileResource', attribute = 'userprofile', related_name='user', full=True, null=True) 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 
     allowed_methods = ['get', 'post', 'delete', 'put'] 
     fields = ['username'] 
     filtering = { 
       'username': ALL, 
       } 
     authorization = Authorization() 

    def obj_create(self, bundle, request=None, **kwargs): 
     try: 
      bundle = super(UserResource, self).obj_create(bundle, request, **kwargs) 
      bundle.obj.set_password(bundle.data.get('password')) 
      bundle.obj.save() 
     except IntegrityError: 
      raise BadRequest('IntegrityError') 
     return bundle 

. 모델 필드가 OneToOneField로 변경되었으며 resources 속성이 이제 "userprofile"임을 유의하십시오. 나는 이것이 누군가를 도와 줄 수 있기를 바란다!

John

+0

고마워요! 몇 시간 동안 나를 구 했어요. :) Upvoted. –

+0

@johnoc, 이것 덕분에, 그것은 나를 많이 도와 줬어! – noahandthewhale

+0

잘 했어 .... 계속. :) – CrazyGeek

관련 문제