2012-03-02 23 views
10

Tôi đang cố gắng tạo các phiên bản mới với công việc Tastypie, nhưng tôi vẫn gặp phải lỗi này với các khóa ngoại. Đây là công cụ của tôi:Django Tastypie tạo tài nguyên mới có khóa ngoại?

Models:

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 

nguồn Model (tôi sử dụng phương thức xác thực của riêng tôi):

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

gọi API của tôi sử dụng 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 
}); 

Và lỗi tôi nhận được:

(1048, \ "Cột 'created_by_user_id' không thể được null \")

Tôi có thiếu cái gì ở đây?

+0

Bạn cũng có tài nguyên người dùng không? – kgr

+0

Tôi đang sử dụng đăng ký django và chỉ có một mô hình UserProfile mà chỉ ánh xạ từng người một đến Người dùng –

+0

Tastypie hoạt động trên Tài nguyên thay vì trên Mô hình, vì vậy đối với "/ api/user/1 /" để trỏ đến Người dùng bạn cũng cần một tài nguyên người dùng, mô hình sẽ không đủ. Tôi hy vọng rằng sẽ giúp :) – kgr

Trả lời

14

Tôi nghĩ rằng những gì bạn cần là định nghĩa của lĩnh vực mối quan hệ, một cái gì đó như thế này nên làm việc:

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

Tôi đã kiểm tra và không có định nghĩa lĩnh vực tương tự tôi nhận được một lỗi giống như bạn.

4

Điều này cũng hoạt động. Như đã giải thích ở đây trong số này 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

Điều này giống hệt với câu trả lời của kgr. [ForeignKey là bí danh cho ToOneField] (http://django-tastypie.readthedocs.org/en/latest/fields.html#foreignkey). – dbn

Các vấn đề liên quan