Come configurare Tastypie per trattare un campo come univoco? La mia aspettativa sarebbe quella di ricevere una sorta di errore non-500 (forse un conflitto 409?) Come risposta se provo a inserire voci duplicate per il campo contrassegnato come univoco.Come configurare Tastypie per trattare un campo come univoco?
Ho guardato attraverso i documenti e sembra che dovrebbe essere ovvio per me, ma per qualche motivo non sto ricevendo la risposta mi sarei aspettato di vedere.
ecco il link documentazione:
http://readthedocs.org/docs/django-tastypie/en/latest/fields.html?highlight=unique
Il codice di esempio è la seguente:
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)
L'errore che ricevo è il seguente (usando curl per colpire il mio servizio locale):
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"}
Quando rimuovo unique=True, db_index=True,
dal modello azienda , Non ricevo l'errore di integrità, ma invece viene creata una nuova risorsa duplicata. Ancora una volta, questo non è il risultato atteso, poiché mi aspetterei che sia univoco effettuare una validazione e causare una risposta non 500.
Sono di fronte alla stessa cosa con i campi del modello definiti come vuoto = True. Tastypie sta creando record con voci vuote. – Erik
La risposta per me era usare validation = FormValidation (form_class =). Questo vale contro i campi del tuo modello. –
Erik