I am creating UserResource and UserProfileResource. When I create a new user I see that my userprofile database table is also being updated. Which is good. But when I GET the user I get an error saying:
The model '' has an empty attribute 'profile' and doesn't allow a null value.
My code:
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()
Anyone any ideas? johnoc
After a lot of searching I finally got an answer to this.
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
This works. Note that the model field has changed to OneToOneField and that the resources attribute is now "userprofile". I hope this helps someone out there!
John
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With