用ForeignKey发布Django Tastypie

时间:2013-12-13 20:27:14

标签: ajax django post tastypie

我目前正在学习Django和Tastypie。我一直在寻找答案,但似乎找不到任何能够解决这个问题的事情。

我在Tastypie中定义了三个资源:用户,搜索和评论。搜索有很多评论。

models.py 的简要介绍是:

class Search(models.Model):
    search_name = models.CharField(max_length=40, unique=True)
    search_slug = models.SlugField(default='')
    search_description = models.TextField(blank=True)
    splunk_search = models.TextField()
    splunk_results = models.TextField(blank=True)

class Comment(models.Model):
    search = models.ForeignKey(Search)
    author = models.ForeignKey(User)
    comment_title = models.CharField(max_length=80)
    comment = models.TextField()

在我的 api.py

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'

class SearchResource(ModelResource):
    comments = fields.ToManyField('myapp.api.CommentResource','comments', null=True, blank=True)

    class Meta:
        queryset = Search.objects.all()
        list_allowed_methods = ['get', 'post']
        detail_allowed_methods = ['get', 'post', 'put', 'delete']
        resource_name = 'search'
        serializer = urlencodeSerializer()
        authentication = Authentication()
        authorization = Authorization()

class CommentResource(ModelResource):
    search = fields.ToOneField(SearchResource, 'search')

    class Meta:
        queryset = Comment.objects.all()
        resource_name = 'comment'
        list_allowed_methods = ['get', 'post']
        detail_allowed_methods = ['get', 'post', 'put', 'delete']
        authorization = Authorization()
        authentication = Authentication()
        serializer = urlencodeSerializer()
        validation = FormValidation(form_class=CommentForm)

js 中的提交处理程序:

 $.ajax({
     type: 'POST',
     url: '/api/v1/comment/',
     dataType: 'json',
     data: $("#commentForm").serialize(),
     processData: false,
     success: function(messages) {
     console.log("Success!");
   },
   error: function() {
     console.log("Oh no, something went wrong!");
   }
 });

我总是收到回复:Comment has no search.

此外,这种形式在tastypie之外完美无缺。原始django表单已排除搜索和作者字段,并且它们的数据已预先填充。我似乎无法在Tastypie中做同样的事情。提前感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

您让SearchResource拥有comments(m2m关系),但您未在模型类Search中指定它,因此我认为您使用了反向关系

如果是的话,而不是

class SearchResource(ModelResource):
    comments = fields.ToManyField('myapp.api.CommentResource','comments', null=True, blank=True)

更改为,

class SearchResource(ModelResource):
    comments = fields.ToManyField('myapp.api.CommentResource', 'comment_set', related_name='search', null=True, full=True)

问题“评论没有搜索”,因为您没有指定related_name。另一方面,班级Search没有属性comments,但comment_set(反向关系)。

答案 1 :(得分:0)

看起来您有一个网页,其中包含您尝试发送给tastypie的表单。但是,您的数据是通过以下方式生成的:

$("#commentForm").serialize()

这将生成URL编码数据,但您需要发送JSON。

您需要将数据作为JSON发送。这可能会改为:

JSON.stringify($("#commentForm").serializeArray());

这可能不会直接起作用。您可能需要将serializeArray()的结果修改为tastypie的正确格式,然后再将其传递给JSON.stringify()。