¿Cómo configuro Tastypie para tratar un campo como único? Mi expectativa sería recibir algún tipo de error que no sea 500 (¿posiblemente un conflicto 409?) Como respuesta si trato de insertar entradas duplicadas para el campo marcado como único.¿Cómo configuro Tastypie para tratar un campo como único?
He buscado a través de los documentos y parece que debería ser obvio para mí, pero por alguna razón no estoy recibiendo la respuesta que se puede esperar para ver.
Aquí está el enlace de documentación:
http://readthedocs.org/docs/django-tastypie/en/latest/fields.html?highlight=unique
El código de ejemplo es el siguiente:
urls.py
v1_api = Api(api_name='v1')
v1_api.register(CompanyResource())
urlpatterns = patterns('',
(r'^api/', include(v1_api.urls)),
)
resource.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']
models.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)
El error que recibo es la siguiente (utilizando rizo para golpear mi servicio local):
curl --dump-header - -H "Content-Type: application/json" -X POST --user user:password --data '{"CompanyName": "company", "CompanyId": "1234567890", "Contact": "John", "Email": "[email protected]", "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"}
Cuando quito unique=True, db_index=True,
a partir del modelo de empresa , No recibo el error de integridad, sino que se crea un nuevo recurso duplicado. Nuevamente, este no es el resultado esperado, ya que espero que sea único para realizar alguna validación y causar alguna respuesta que no sea 500.
Me enfrento a lo mismo con los campos del modelo que se definen como en blanco = Verdadero. Tastypie está creando registros con entradas en blanco. – Erik
La respuesta para mí fue usar la validación = FormValidation (form_class =). Esto valida contra los campos de su modelo. –
Erik