首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TastyPie数据验证问题

TastyPie数据验证问题
EN

Stack Overflow用户
提问于 2014-02-06 13:46:07
回答 1查看 2.2K关注 0票数 1

我想知道使用TastyPie验证的正确方法是什么。我有以下资源和模式:

代码语言:javascript
复制
from tastypie.resources import ModelResource

class Station(models.Model):
    name = models.CharField(max_length=20)
    city = models.ForeignKey(City)

class StationResource(ModelResource):
    city = fields.ForeignKey(CityResource, 'city')

    class Meta:
        queryset = caModels.Station.objects.all()
        resource_name = 'Station'
        authorization = Authorization()
        validation=FormValidation(form_class=StationForm)
        max_limit = None    

我还想使用一个ModelForm来验证数据:

代码语言:javascript
复制
class StationForm(forms.ModelForm):    

    class Meta:
        model = caModels.Station

    def clean_city(self):
        return self.cleaned_data['city']

以下查询工作良好:

代码语言:javascript
复制
curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"city": "/resources/City/89/", "name": "station_1", <and other fields here>}' "http://localhost:8000/resources/Station/?format=json"

HTTP/1.0 201 CREATED
Date: Thu, 06 Feb 2014 13:10:14 GMT
Server: WSGIServer/0.1 Python/2.7.4
Vary: Accept, Cookie
Content-Type: text/html; charset=utf-8
Location: http://localhost:8000/resources/Station/3/

但是,当我从请求中删除城市(但这个字段是必需的)而不是消息‘这个字段是必需的’时,我会得到以下的回溯:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response
response = callback(request, *callback_args, **callback_kwargs)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 77, in wrapped_view
return view_func(*args, **kwargs)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/resources.py", line 217, in wrapper
response = callback(request, *args, **kwargs)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/resources.py", line 459, in dispatch_list
return self.dispatch('list', request, **kwargs)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/resources.py", line 491, in dispatch
response = method(request, **kwargs)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/resources.py", line 1357, in post_list
updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs))
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/resources.py", line 2149, in obj_create
bundle = self.full_hydrate(bundle)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/resources.py", line 909, in full_hydrate
value = field_object.hydrate(bundle)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/fields.py", line 732, in hydrate
value = super(ToOneField, self).hydrate(bundle)
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/tastypie/fields.py", line 165, in hydrate
elif self.attribute and getattr(bundle.obj, self.attribute, None):
  File "/home/ak/venv/main_env/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 389, in __get__
raise self.field.rel.to.DoesNotExist
DoesNotExist

甚至在我能够验证表单中的数据之前就会发生此错误(验证是保存过程的第一个进程)。

代码语言:javascript
复制
.../tastypie/resources.py:

def obj_create(self, bundle, **kwargs):
    """
    A ORM-specific implementation of ``obj_create``.
    """
    bundle.obj = self._meta.object_class()

    for key, value in kwargs.items():
        setattr(bundle.obj, key, value)

    self.authorized_create_detail(self.get_object_list(bundle.request), bundle)
    bundle = self.full_hydrate(bundle)
    return self.save(bundle)

def save(self, bundle, skip_errors=False):
    self.is_valid(bundle)
    ...

有人能指出我哪里错了吗,或者我可能遗漏了什么,而从TastyPie的角度来看,这种验证方式是完全错误的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-06 17:41:39

我觉得你的问题很有趣。

我决定深入研究一下主题。

这是我发现的。

  1. 文档:空白 正如我们所看到的,这种描述非常类似于我们已经从Django了解到的内容。
  2. 代码库:水合物 --如果您不明确地说Tastypie会“期望”这个字段存在。

简短的结论:我认为资源就像模型之外的东西,元数据可能与需求有很大的不同,例如,它可以给你更多的灵活性。

可能的解决办法:

  1. 如果它是空白的,就对它说,把它递给我。无论如何,模型验证不会通过它。 类StationResource(ModelResource):city = fields.ForeignKey(CityResource,'city',blank=True)
  2. 或者添加默认水合物。 类StationResource(ModelResource):city = fields.ForeignKey(CityResource,'city') def水合物(self,bundle):如果不是hasattr( bundle,'city'):bundle.data'city‘=无返回包

结论:这其实是相当误导,但另一方面,Tastypie仍在发展,也许医生会更好地覆盖它,这将改变,或有改变的计划。

如果你更感兴趣的话,在github上有很多争论的话题:就像这个类似于你的问题:问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21604745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档