2

django-tastypie アプリには、次の Django モデルがあります。

class Car(models.Model):
    name=models.CharField('name',max_length=64)

class CarTrack(models.Model):
    car=models.ForeignKey(Car)
    tdata=models.CharField('track data',max_length=255)
    created = models.DateTimeField('created time',auto_now_add=True)

次のtastypieリソースを作成しました:

class CarRsc(ModelResource):
    class Meta:
        queryset=Car.objects.all()
        resource_name='car'
        authentication = Authentication()
        authorization=Authorization()

class CarTrackRsc(ModelResource):
    car=fields.ForeignKey(CarRsc, 'car')
    class Meta:
        queryset=Detection.objects.all()
        resource_name='track'
        authentication = Authentication()
        authorization=Authorization()
    def hydrate(self, bundle):
        if not bundle.obj.pk:
            bundle.obj.car=bundle.request.user.get_profile().car
        return bundle

クライアントが新しい CarTrackRsc (例: {"tdata":"blablabla"}) を送信するときに、CarTrack の外部キーを特定の車に設定したいと考えています。上記の例では、ハイドレート メソッドをオーバーライドしてそれを実現しようとしています (現在のログイン ユーザーの車を取得することによって)。しかし、うまくいかないようでした。それは正しい方法ですか?Tastypie のドキュメントには、ハイドレート メソッドの使用方法の例が示されていますが、単純なフィールドに関するものであり、関連フィールド (外部キーなど) に関するヒントはありません。

4

1 に答える 1

2

データに保存したい車を追い越してみましたか?例えば

{"tdata": "blablabla", "car":"/api/v1/car/<<CAR_ID>>/"}

それ以外の場合は、obj_createを使用して現在のユーザーをリクエストから設定しました。これは機能するはずです。次のことを試してください。

def obj_create(self, bundle, request=None, **kwargs):
    return super(CarTrackRsc, self).obj_create(bundle, request, car=request.user.get_profile().car)
于 2011-12-19T09:55:26.553 に答える