6

UserResource と UserProfileResource を作成しています。新しいユーザーを作成すると、userprofile データベース テーブルも更新されていることがわかります。どっちがいい。しかし、ユーザーを取得すると、次のエラーが表示されます。

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

誰でもアイデアはありますか?ジョノック

4

1 に答える 1

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 に変更され、リソース属性が "userprofile" になっていることに注意してください。これが誰かを助けることを願っています!

ジョン

于 2012-05-18T10:15:10.820 に答える