0

私がやろうとしているのは、次のコード ブロックでわかるように、モデルからのクエリ結果をモデル リソースに追加することです。

def dehydrate(self, bundle):
    bundle.data['image'] = place_image.image.get(place=1).get(cardinality=0)

place=1 および cardinality=0 の place_site モデルの画像を含む PlaceResource にフィールドを追加したいと考えています。しかし、私はエラーを受け取ります:

The 'image' attribute can only be accessed from place_image instances

それで、私の質問は、tastypie モデルリソースで別のモデルからのクエリ結果を使用することは不可能ですか? 英語が下手で申し訳ありませんが、何か間違っている場合は修正してください。御時間ありがとうございます。完全なコードがあります:

モデル.py:

class place(models.Model):
    idPlace = models.AutoField(primary_key=True)
    Name = models.CharField(max_length=70)


class place_image(models.Model):
    idImage = models.AutoField(primary_key=True)
    place = models.ForeignKey(place,
                              to_field='idPlace')
    image = ThumbnailerImageField(upload_to="place_images/", blank=True)
    cardinality = models.IntegerField()

API.py

from models import place
from models import place_image


class PlaceResource(ModelResource):

    class Meta:
        queryset = place.objects.all()
        resource_name = 'place'
        filtering = {"name": ALL}
        allowed_methods = ['get']


    def dehydrate(self, bundle):
        bundle.data['image'] = place_image.image.get(place=1).get(cardinality=0)

        return bundle


class PlaceImageResource(ModelResource):
    place = fields.ForeignKey(PlaceResource, 'place')

    class Meta:
        queryset = place_image.objects.all()
        resource_name = 'placeimage'
        filtering = {"place": ALL_WITH_RELATIONS}
        allowed_methods = ['get']
4

1 に答える 1

1

あなたが得ているエラーは、インスタンスではなくimageモデルクラスの属性にアクセスしているという事実によって引き起こされます。

メソッドで脱水されているオブジェクトは、パラメーターの属性にdehydrate格納されます。また、モデルクラスの属性にアクセスすることにより、モデルをフィルターしてモデルのみにフィルタリングしようとしています。このようなフィルタリングは、インスタンスではないため機能しません。代わりに属性を使用する必要があります。さらに、メソッドは実際のモデル インスタンスを返すため、モデルインスタンスに属性がないため、後続の呼び出しで発生します。objbundleplace_imageplace=1cardinality=0imageplace_imageimageModelManagerobjectsget()get()AtributeErrorplace_imageget

したがって、全体として、次のdehydrateようになります。

def dehydrate(self, bundle):
    bundle.data['image'] = place_image.objects.get(place_id=1, cardinality=0).image
    return bundle

このコードでは、目的の値を持つ が存在する必要があることに注意してください。それ以外の場合は、がスローされます。place_imageplace_image.DoesNotExist

モデルには冗長性もあります。

  • idPlaceidImageデフォルトでは、django は他の主キー フィールドが定義されていないときに呼び出される主キーである を作成するため、削除できますAutoFieldid
  • place_image.placeto_fieldデフォルトForeignKeyでは主キーフィールドを指すため、フィールドには冗長なパラメーターがあります
于 2013-10-09T12:07:55.903 に答える