python - 如何配置 Tastypie 以将字段视为唯一字段?

标签 python django tastypie

如何配置 Tastypie 以将字段视为唯一字段?如果我尝试为标记为唯一的字段插入重复条目,我的期望是收到某种非 500 错误(可能是 409 冲突?)作为响应。


我已经查看了文档,看起来这对我来说应该是显而易见的,但出于某种原因,我没有得到我期望看到的响应。

这是文档链接:

http://readthedocs.org/docs/django-tastypie/en/latest/fields.html?highlight=unique


示例代码如下:

网址.py

v1_api = Api(api_name='v1')
v1_api.register(CompanyResource())

urlpatterns = patterns('',
    (r'^api/', include(v1_api.urls)),
)

资源.py

class CompanyResource(ModelResource):

    CompanyName = fields.CharField(attribute='company_name')
    CompanyId = fields.CharField(attribute='company_id', unique=True)
    Contact = fields.CharField(attribute='contact')
    Email = fields.CharField(attribute='email')
    Phone = fields.CharField(attribute='phone')

    class Meta:
        queryset = Company.objects.all()
        authentication = BasicAuthentication()
        authorization = Authorization()
        allowed_methods = ['get', 'post']

模型.py

class Company(models.Model):

    company_name = models.TextField(default=None, blank=True, null=True)
    company_id = models.CharField(default='', unique=True, db_index=True, max_length=20)
    contact = models.TextField(default=None, blank=True, null=True)
    email = models.EmailField(default=None, blank=True, null=True)
    phone = models.TextField(default=None, blank=True, null=True)

我收到的错误如下(使用 curl 访问我的本地服务):

curl --dump-header - -H "Content-Type: application/json" -X POST --user user:password --data '{"CompanyName": "company", "CompanyId": "1234567890", "Contact": "John", "Email": "example@example.com", "Phone": "555-555-5555"}' http://localhost:8000/api/v1/company/
HTTP/1.0 500 INTERNAL SERVER ERROR
Date: Thu, 15 Sep 2011 18:25:20 GMT
Server: WSGIServer/0.1 Python/2.7.1
Content-Type: application/json; charset=utf-8

{"error_message": "(1062, \"Duplicate entry '1234567890' for key 'api_company_company_id_uniq'\")", 
...<snip>...
raise errorclass, errorvalue\n\nIntegrityError: (1062, \"Duplicate entry '1234567890' for key 'api_company_company_id_uniq'\")\n"}

当我从 Company 模型中删除 unique=True, db_index=True, 时,我没有收到完整性错误,而是创建了一个新的重复资源。同样,这不是预期的结果,因为我希望 unique 执行一些验证并导致一些非 500 响应。

最佳答案

我是这样解决问题的:

根据验证文档,我能够实现一个自定义验证器来为我检查字段的唯一性。 http://django-tastypie.readthedocs.org/en/latest/validation.html

在 CompanyResource 中,我向类元中添加了一个 CustomValidation。我将 CustomValidation 的实现放在 validations.py 文件中。如果 isValid 返回错误,则 api 将返回 400,其中包含错误中的消息。

class CompanyResource(ModelResource):
    """
    CompanyIds should be unique
    """     
    CompanyName = fields.CharField(attribute='company_name')     
    CompanyId = fields.CharField(attribute='company_id', unique=True)     
    Contact = fields.CharField(attribute='contact')     
    Email = fields.CharField(attribute='email')     
    Phone = fields.CharField(attribute='phone')    

    class Meta:        
        queryset = Company.objects.all()        
        authentication = BasicAuthentication()        
        authorization = Authorization()        
        allowed_methods = ['get', 'post']                
        validation = CustomValidation()

验证.py

class CustomValidation(Validation):
    """
    The custom validation checks two things:
       1) that there is data
       2) that the CompanyId exists (unique check)
    """
    def is_valid(self, bundle, request=None):
        if not bundle.data:
            return {'__all__': 'Missing data, please include CompanyName, CompanyId, Contact, Email, and Phone.'}

        errors = {}                                    
        company_id=bundle.data.get('CompanyId', None)

        # manager method, returns true if the company exists, false otherwise
        if Company.objects.company_exists(company_id):
            errors['CompanyId']='Duplicate CompanyId, CompanyId %s already exists.' % company_id
        return errors

关于python - 如何配置 Tastypie 以将字段视为唯一字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7435986/

相关文章:

python - 从 tastypie 上的资源中删除列表端点

python - Django Tastypie 使用 PATCH 或 PUT 请求进行多对多( self )字段更新?

python - 如何索引张量并更改值

python - 获取相关模型日期字段的最小值(django)

django - 处理对 Django Web 应用程序的计算密集型请求,可能使用预 fork RPC 服务器

python - 类型对象 'Post' 没有属性 'published' Django

python - 可以在定义中更改函数名称吗?

python - Unicode解码错误: 'utf8' codec can't decode byte

python - 如何修改我的代码以提供 dict 数据类型的输入?

python-2.7 - 如何在 python 中传递列表进行测试?