2012-03-02 18 views
10

Sto cercando di creare nuove istanze con Tastypie, ma continuo a ricevere questo errore con le chiavi esterne. Ecco la mia roba:Django Tastypie crea una nuova risorsa con chiavi esterne?

Modelli:

class SuggestionVote(models.Model): 
    created_by_user = models.ForeignKey(User) 
    date_created = models.DateTimeField(auto_now_add = True) 
    suggestion = models.ForeignKey(Suggestion) 

class Suggestion(models.Model): 
    title = models.TextField(blank=True,null=True) 
    created_by_user = models.ForeignKey(User) 
    date_created = models.DateTimeField(auto_now_add = True) 
    votes = models.IntegerField(default=0)  

    def __unicode__(self): 
     return self.title 

risorse Girl (io uso il mio metodo di autenticazione):

class UserResource(ModelResource): 
    class Meta: 
     list_allowed_methods = ['get'] 
     queryset = User.objects.all() 
     resource_name = 'user' 
     authentication = MyBasicAuthentication() 
     authorization = DjangoAuthorization() 
class SuggestionResource(ModelResource): 
    class Meta: 
     list_allowed_methods = ['get'] 
     queryset = Suggestion.objects.all() 
     resource_name = 'suggestion' 
     authentication = MyBasicAuthentication() 
     authorization = DjangoAuthorization() 

class SuggestionVoteResource(ModelResource): 
    class Meta: 
     list_allowed_methods = ['get', 'post'] 
     detail_allowed_methods = ['get', 'post', 'put', 'delete'] 
     queryset = SuggestionVote.objects.all() 
     resource_name = 'suggestionvote' 
     authentication = MyBasicAuthentication() 
     authorization = DjangoAuthorization() 

mia chiamata API utilizzando jQuery:

var data = JSON.stringify({ 
    "suggestion": "/api/suggestion/1/", 
    "created_by_user": "/api/user/1/" 
}); 

$.ajax({ 
    url: 'http://127.0.0.1:8000/api/suggestionvote/', 
    type: 'POST', 
    contentType: 'application/json', 
    data: data, 
    dataType: 'json', 
    processData: false 
}); 

E l'errore si verifica:

(1048, \ "La colonna 'created_by_user_id' non può essere nulla \")

Mi manca qualcosa qui?

+0

Hai anche la risorsa Utente? – kgr

+0

Sto usando la registrazione django e ho solo un modello UserProfile che mappa solo uno a uno per l'utente –

+0

Tastypie funziona su risorse piuttosto che su modelli, quindi per "/ api/user/1 /" per indicare all'utente anche bisogno di una risorsa utente, il modello non sarà sufficiente. Spero che questo aiuti :) – kgr

risposta

14

Penso che quello che vi serve è la definizione del campo di relazione, qualcosa di simile a questo dovrebbe funzionare:

from tastypie import fields 

class SuggestionResource(ModelResource): 
    # the relationship 
    created_by_user = fields.ToOneField(UserResource, 'created_by_user', full = True) 

    class Meta: 
     list_allowed_methods = ['get'] 
     queryset = Suggestion.objects.all() 
     resource_name = 'suggestion' 
     authentication = MyBasicAuthentication() 
     authorization = DjangoAuthorization() 

Ho controllato e senza definizione di campo simile ottengo un errore come la tua.

4

Anche questo funziona. Come spiegato qui in questo Tastypie Tutorial

from tastypie import fields 

class SuggestionResource(ModelResource): 
    # the relationship 
    created_by_user = fields.ForeignKey(UserResource, 'created_by_user') 

    class Meta: 
     list_allowed_methods = ['get'] 
     queryset = Suggestion.objects.all() 
     resource_name = 'suggestion' 
     authentication = MyBasicAuthentication() 
     authorization = DjangoAuthorization() 
+4

Questo è identico alla risposta di kgr. [ForeignKey è un alias per ToOneField] (http://django-tastypie.readthedocs.org/en/latest/fields.html#foreignkey). – dbn

Problemi correlati