我正在计划一个用于REST API的Django和Tastypie站点,以及 我正在艰难地想出要包括的“正确”方式 返回资源中的子资源。
作为沙盒,我使用Ticket模型和TicketComment创建了一个小应用程序 模型,其中注释属于票证。我看了Tastypie Cookbook 嵌套资源上的食谱(http://django-tastypie.readthedocs.org/en/latest/cookbook.html#nested-resources), 但我很难理解为什么要这样做。下面的代码 使用django.forms.models.model_to_dict()来获取票证中的注释, 但我觉得某处肯定会有“陷阱”。
我不应该做我现在正在做的事情吗?还有,是吗? 清洁感的模式比食谱中列出的更清晰?
模型如下:
# tickets/models.py
from django.db import models
class Ticket(models.Model):
title = models.CharField(max_length=200)
create_ts = models.DateTimeField(auto_now_add=True)
submitter_email = models.EmailField()
PRIORITY_CHOICES = (
('H', 'High'),
('M', 'Medium'),
('L', 'Low'),)
priority = models.CharField(max_length=1, choices=PRIORITY_CHOICES)
description = models.TextField()
STATUS_CHOICES = (
('NEW', 'New & Unclaimed'),
('WIP', 'Work In Progress'),
('RES', 'Resolved'),
('CLS', 'Closed'),)
status = models.CharField(max_length=3, choices=STATUS_CHOICES)
def __unicode__(self):
return "<Ticket:%d:%s>" % (self.id, self.title,)
class TicketComment(models.Model):
ticket = models.ForeignKey(Ticket)
comment_ts = models.DateTimeField(auto_now_add=True)
commenter_email = models.EmailField()
comment = models.TextField()
def __unicode__(self):
return "<TicketComment:%d:%d>" % (self.ticket.id, self.id,)
资源如下:
# tickets/api.py
from tastypie import fields
from tastypie.resources import ModelResource
from tickets.models import Ticket, TicketComment
from django.forms.models import model_to_dict
class TicketResource(ModelResource):
class Meta:
queryset = Ticket.objects.all()
resource_name = 'ticket'
def dehydrate(self, bundle):
comments = TicketComment.objects.filter(ticket=bundle.data['id'])
bundle.data['comments'] = [model_to_dict(c) for c in comments]
return bundle
class TicketCommentResource(ModelResource):
ticket = fields.ForeignKey(TicketResource, 'ticket')
class Meta:
queryset = TicketComment.objects.all()
resource_name = 'comment'
输出如下:
{
comments: [
{
comment: "This is the first comment.",
commenter_email: "me@example.com",
id: 1,
ticket: 1
},
{
comment: "This is the second comment.",
commenter_email: "me@example.com",
id: 2,
ticket: 1
}
],
create_ts: "2011-10-17T15:55:11.372000",
description: "This is the first ticket.",
id: "1",
priority: "M",
resource_uri: "/api/v1/ticket/1/",
status: "NEW",
submitter_email: "me@example.com",
title: "First Ticket"
}
答案 0 :(得分:14)
答案 1 :(得分:1)
你能发布你的解决方案吗?
我有相同的用例/模型(在“子表”中建立的外键关系船指向父表)但无法解析它。
我看到的解决方案是将此行添加到TicketResource中,而不是在元子类中的类级别:
comments = fields.ToManyField('TicketCommentResource', 'ticket', full=True)
然后可能还会在类级别将其添加到TicketCommentResource:
event = fields.ForeignKey('TicketResource', 'event')
但我总是得到错误,我的父对象资源(在你的示例TicketResource中)没有属性'ticket',这是发送到ToManyField的第二个术语。
我试图玩这个很多,但似乎无法获得获胜的组合。 你最初发布的解决方案有效,但你自己指出它不理想。
谢谢!