Django Tastypie:将多个模型中的值发布到单个Tastypie资源中

时间:2016-03-10 03:02:59

标签: django tastypie

第一个模型:

class Profile(models.Model):

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(
                r'^[\w.@+-]+$',
                _('Enter a valid username. This value may contain only '
                  'letters, numbers ' 'and @/./+/-/_ characters.')
            ),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
   password = models.CharField(max_length=12, default='123456')
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

第二种模式:

class UserEbiz(models.Model):
    user_id = models.ForeignKey('Profile')
    password = models.CharField(max_length=12, default='123456')

Tastypie资源:

class ProfileResources(ModelResource):
    id = fields.CharField(attribute='id')

    class Meta:
        queryset = Profile.objects.all()
        resource_name = 'profile'

        filtering = {
            "id": ALL,
        }

我想创建一个只使用一个资源可以同时为两个表保存值的函数。我的问题是如何使用ProfileResources将值发布到Profile和UserEbiz模型中。

2 个答案:

答案 0 :(得分:2)

@ sean-hayes答案很好但是如果你真的想Post ProfileResource数据而不是UserEbiz首先将ProfileResource更改为

class ProfileResource(ModelResource):
    ebiz = fields.ToManyField(UserEbizResource, 'userebiz_set', readonly=True)

请注意首先您有ForeignKey Profile。因此1:MProfile UserEbizreadonly

第二次我已将UserEbiz设置为true,因为我将自己处理models.ForeignKey('Profile', blank=True, null=True)数据。但是,如果您有M2M,那就像创建readonly数据一样,只需删除override属性即可。

因此,obj_create ebiz可以自己处理def obj_create(self, bundle, **kwargs): ebiz = bundle.data.pop('ebiz', None) bundle = super(ProfileResource, self).obj_create(bundle, **kwargs) if not ebiz: return bundle ebiz.update(user_id=bundle.obj) # change it to user in model and here ebiz_res = UserEbizResource() ebiz_bundle = ebiz_res.build_bundle(data=ebiz) ebiz_res.obj_create(ebiz_bundle) return bundle 数据。代码可能看起来像

$(document.body).on('change','input[type=checkbox]',function(){
    if ($(this).prop('checked') == 1){
        alert('checked');
    }else{
        alert('unchecked');
}

答案 1 :(得分:1)

你会想要这样的东西:

class UserEbizResource(ModelResource):
    user_id = fields.ToOneField(ProfileResources, attribute='user_id')

    class Meta:
        queryset = UserEbiz.objects.all()
        resource_name = 'userebiz'

        excludes = ['password']
        filtering = {
            "id": ALL,
        }

其他一些建议:

  • ProfileResources重命名为ProfileResource
  • UserEbiz.user_id重命名为UserEbiz.profile
  • 考虑使用Django的用户模型或自定义它而不是完全自定义模型