我目前正在学习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中做同样的事情。提前感谢您的任何建议。
答案 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()。