Django Tastypie - 本地化,数据库架构

时间:2012-09-09 04:21:05

标签: django django-models tastypie

我对Django和Django tastypie比较新,所以我的问题可能很简单。

我正在尝试使用tastypie实现RESTFUL服务,以实现可本地化的文本。

我的Django资源是:

#The different languages
class Language(models.Model):
    abbreviation = models.CharField(max_length=6)
    name = models.CharField(max_length=100)

# The different Chapters in the book
class Chapter(models.Model):
    name = models.CharField(max_length=200)

# The different Lines of the chapters (by sections)
class Line(models.Model):
    chapter= models.ForeignKey(Chapter)
    section = models.IntegerField()
    line = models.IntegerField()

# The different translations of the line
class LineLanguage(models.Model):
    language = models.ForeignKey(Language)
    line = models.ForeignKey(Line)
    text = models.TextField()

然后我有了tastypie资源:

class LanguageResource(ModelResource):
    class Meta: queryset = Language.objects.all()
    resource_name = 'language'
    authorization = Authorization

class ChapterResource(ModelResource):
    class Meta: queryset = Chapter.objects.all()
    resource_name = 'chapter'
    authorization = Authorization()

class LineResource(ModelResource):
    chapter = fields.ForeignKey(ChapterResource, 'chapter')
    class Meta: queryset = Line.objects.all()
    resource_name = 'line'
    authorization = Authorization()

class LineLanguageResource(ModelResource):
    language= fields.ForeignKey(LanguageResource, 'language')
    line = fields.ForeignKey(LineResource, 'line')
    class Meta: queryset = LineLanguage.objects.all()
    resource_name = 'lineLanguage'
    authorization = Authorization()

最初我只想使用restful服务(因此我的url.py只包含“url(r'^api/', include(v1_api.urls)),”,但我无法得到我想要的东西:

我希望能够通过单个restful调用在正确的翻译中检索特定的文本行,但在不知道LineLanguageID的情况下这是不可能的。

在使用tastypie之前。我在url.py中设置了一些设置,允许我使用此类网址www.myapp.com/api/v1/language/chapter/section/line找到它(因此,例如www.myapp.com/api/v1/en/1/1/1会返回第一个第一部分的第一行英文章节,但我想切换到RESTFUL api(主要是因为我想试验backbone.js)

我认为我的问题是我的模型/ tastypie资源的设计不好,或者缺乏如何将我的模型转换为适当的tastypie资源的知识。 你有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你可能会设计你的模型略有不同。我不知道你的其他需求是什么,但你可能会把模型改成这样的东西:

#The different languages
class Language(models.Model):
    abbreviation = models.CharField(max_length=6)
    name = models.CharField(max_length=100)

# The different Lines of the chapters (by sections)
class Line(models.Model):
    name = models.CharField(max_length=200)
    section = models.IntegerField()
    line = models.IntegerField()
    language = models.ForeignKey(Language)
    text = models.TextField()

然后,您必须为Line模型定义一个资源,并且您将使用类似于以下的请求查询语言/ section / chapter / line:

www.myapp.com/api/v1/line/?language__abbreviation=en&section=1&chapter=1&line=1

如果您不想更改模型,可以通过以下方式调用api来实现您想要的效果:

www.myapp.com/api/v1/lineLanguage/?language__abbreviation=en&line__line=1&line__section=1&line__chapter__name=1

请注意,对于这两种情况,资源的外键字段都需要设置full=True参数,因为您需要查询外部模型的字段。

如果您想使用旧的url模式,可以通过在LineLanguageResource中定义包含将处理来自url的参数的模式的override_urls方法来实现这一点,将其传递给某个方法然后将它们作为request.GET元素传递给tastypies'dispatch_detail方法。