0

私は Django と Django のおいしいパイに比較的慣れていないので、私の質問は非常に些細なことかもしれません。

ローカライズ可能なテキスト用に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()

最初は安らかなサービスのみを使用したかった (したがって、私の url.py には " url(r'^api/', include(v1_api.urls))," しか含まれていませんが、必要なものを取得できません:

1 回の安らかな呼び出しで特定のテキスト行を正しい翻訳で取得できるようにしたいのですが、LineLanguageID を知らなければ不可能です。

TastyPieを使う前に。この種の URL を使用して検索できるように、url.py にいくつかの設定がありましたwww.myapp.com/api/v1/language/chapter/section/line(たとえば www.myapp.com/api/v1/en/1/1/1、最初の章の最初のセクションの最初の行が英語で返されるように)。 RESTFUL api へ (主に backbone.js で実験したいため)

私の問題は、モデル/taspypie リソースの設計が悪いか、モデルを適切なtaspypie リソースに変換する方法に関する知識が不足していることのいずれかだと思います。あなたの提案は何ですか?

4

1 に答える 1

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

次に、モデルのリソースを 1 つだけ定義する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 パターンを使用したい場合はoverride_urls、LineLanguageResource で URL からの引数を処理するパターンを含むメソッドを定義することでそれを実現できます。それをいくつかのメソッドに渡し、そのメソッドがそれらを Tastypies のdispatch_detailメソッドに渡します。 request.GET 要素として。

于 2012-09-09T15:19:02.617 に答える