1

私がやりたいことは、m2m フィールドのデフォルト値を設定することであり、post_save シグナルでそれを行います。最小限のコードは次のとおりです。

# models.py
class Question(models.Model):
    options = models.ManyToManyField(Option)
    body = models.CharField(max_length=140)

def default_options(sender, instance, created, **kwargs):
    if created and not instance.options.all():
        options = Option.objects.filter(id__in=[1, 2])
        instance.options.add(*options) 
        instance.save()

post_save.connect(default_options, sender=Question)

「通常の」保存が呼び出されると、正常に機能します。

>>> q=Question(body='test')
>>> q.save()
>>> q.options.all()
[<Option[1]>, <Option[2]>]

ただし、モデルがtastypieにハマっている場合、オプションは決して設定されません..

# api.py 
class QuestionResource(ModelResource):
    options = fields.OneToManyField('qa.api.OptionResource', 'options', full=True, blank=True)
    class Meta:
        queryset = Question.objects.all()

# try to create a question:
curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"body":"test"}' http://localhost:8000/api/0.1/question/

サーバーは 201 を返しますが、質問のオプションが設定されていません。

私の質問は次のとおりです。

  • 保存後のシグナルを使用して m2m フィールドのデフォルト値を設定する権利はありますか?
  • もしそうなら、tastypie のハックは何ですか?
  • そうでない場合、それを行う正しい方法は何ですか?
  • 私は、tastypie の ManyToMany フィールドにデフォルトのオプションがあることに気付きました。この場合の使用方法、またはそれに関する完全なドキュメントはどこにありますか..
4

1 に答える 1

2

m2mdjango-tastypie 側でリレーションを処理するには 2 つの方法があります。

関数をオーバーライドするための 1 つobj_createここでさらにヘルプが表示されます。

class QuestionResource(ModelResource):
   options = fields.OneToManyField('qa.api.OptionResource', 'options', full=True, blank=True)
   class Meta:
      queryset = Question.objects.all()

   def obj_create(self, bundle, request, **kwargs):
       print "hey we're in object create"
       # do something with bundle.data,
       return super(QuestionResource, self).obj_create(bundle, request, **kwargs)

2 つ目の方法は、curl リクエストを介して行うことです。

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"body":"test", "options": ["/api/v1/option/1/"]}' http://localhost:8000/api/0.1/question/
于 2012-09-11T13:08:10.520 に答える