Tascypie foreignkey set to null

I am creating a UserResource and UserProfileResource. When I create a new user, I see that the userprofile database table is also being updated. And this is good. But when I GET the user, I get an error:

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

My code is:

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

Any ideas? johnoc

+6
source share
1 answer

After a great search, I finally got the answer to this question.

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 

It works. Note that the model field has changed to OneToOneField and that the resource attribute is now "userprofile". I hope this helps someone out there!

John

+15
source

Source: https://habr.com/ru/post/915805/


All Articles