2

2 つの関連する Django モデルABOneToMany関係にあるとします。

models.py

class A(models.Model):
  name = models.CharField(max_length=5)

class B(models.Model):
  name = models.CharField(max_length=5)
  a = models.ForeignKey(A)

与えられた (最適ではない可能性がある) Tastypie リソース:

api.py

class AResource(ModelResource):
    bs = fields.ToManyField( 'projectname.api.BResource', 'bs', full = True)
    class Meta:
        queryset = A.objects.all()

class BResource(ModelResource):
    a = fields.ToOneField( AResource, 'a', full = True)
    class Meta:
        queryset = B.objects.all()

これまでのところ、データベースは空であると仮定しましょう。関連する外部データがあり、A のインスタンスと B のいくつかのインスタンスの両方でデータベースを混雑させたいと考えています。

この問題にアプローチするための最も美しいTastypionicの方法は何ですか? AとBの両方を同時に混雑させることはできますか?それとも、最初に A を群集し、次に A の ID を ForeignKey として提供して B を群集化する必要がありますか?

誰かが投稿の例を考え出すことができれば、それは素晴らしいことです (たとえば、python 辞書と httplib2、または curl を使用して)。

どうもありがとう。

4

2 に答える 2

1

OneToMany関係の代わりにManyToManyを含む1つのソリューションを次に示します。

models.py

class B(models.Model):
    name = models.CharField(max_length=5)

class A(models.Model):
    name = models.CharField(max_length=5)
    bs = models.ManyToManyField(B)

api.py

class BResource(ModelResource):
    class Meta:
        queryset = B.objects.all()
        resource_name = 'b'

class AResource(ModelResource):
    bs = fields.ToManyField( BResource, 'bs', related_name = 'a', full = True, null=True)
    class Meta:
        queryset = A.objects.all()
        resource_name = 'a'

カール

curl -v -H "Content-Type: application/json" -X POST --data '{"name":"a_name1", "bs":[{"name":"b_name1"}, {"name": "b_name2"}]}' http:<my_path>/api/a/

httplib2.py

httplib2パッケージを使用してPythonスクリプトを介してデータを投稿する実用的な例は、warren -runkによって投稿されたきちんとしたシンプルなソリューションに基づいています。

post_dict(
    url='http:<my_path>/api/a/',
    dictionary={
        'name' : 'a_name1',
        'bs' : [
            {'name' : 'b_name1'},
            {'name' : 'b_name1'},
        ]
    }
)

ただし、AとBを関連付ける追加のテーブルがデータベースに作成されます。AとBのOneToMany関係に基づいたより良い解決策があるかもしれませんか?

于 2012-08-02T13:11:13.803 に答える