2012-05-15 10 views
6

Tworzę UserResource i UserProfileResource. Kiedy tworzę nowego użytkownika widzę, że moja tabela bazy danych userprofile również jest aktualizowana. Co jest dobre. Ale kiedy pojawia się użytkownikowi dostaję błąd mówiąc:Tastypie klucz obcy ustawiony na wartość null

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

Mój kod:

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() 

ktoś jakieś pomysły? johnoc

Odpowiedz

15

Po wielu poszukiwaniach w końcu dostałem odpowiedź na to pytanie.

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 

To działa. Zauważ, że pole modelu zmieniło się na OneToOneField i że atrybut resources jest teraz "userprofile". Mam nadzieję, że to pomoże komuś tam być!

John

+0

Dzięki! Zaoszczędziłem dla mnie kilka godzin. :) Wzniesione. –

+0

@johnoc, dzięki za to, bardzo mi pomogło! – noahandthewhale

+0

Dobra robota .... trzymaj to. :) – CrazyGeek