2012-03-02 15 views
10

Estoy tratando de hacer que la creación de nuevas instancias con Tastypie funcione, pero sigo recibiendo este error con las claves externas. Aquí es mis cosas:Django Tastypie creando nuevo recurso que tiene claves foráneas?

Modelos:

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 

recursos Modelo (yo uso mi propio método de autenticación):

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() 

Mi llamada a la API usando 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 
}); 

Y el error que obtengo:

(1048, \ "columna 'created_by_user_id' no puede ser nulo \")

Me estoy perdiendo algo aquí?

+0

¿Tiene también los recursos del usuario? – kgr

+0

Estoy usando django-registration y solo tengo un modelo de perfil de usuario que solo asigna uno a uno al usuario –

+0

Tastypie trabaja en recursos en lugar de en modelos, por lo que "/ api/usuario/1 /" apunta al usuario que también necesita un recurso de usuario, el modelo no será suficiente. Espero que ayude :) – kgr

Respuesta

14

Creo que lo que necesita es la definición del campo de relación, algo como esto debería funcionar:

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() 

He comprobado y sin definición de campo similar consigo un error como el suyo.

4

Esto también funciona. Como se explica aquí en este 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

Esto es idéntico a la respuesta de kgr. [ForeignKey es un alias de ToOneField] (http://django-tastypie.readthedocs.org/en/latest/fields.html#foreignkey). – dbn

Cuestiones relacionadas