在饼中反规范化模型

问题描述 投票:0回答:1

我正在尝试做的就是将查询结果从模型添加到模型资源,如您在此代码块中所见:

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

我想向PlaceResource添加一个字段,其中将包含来自place_site模型的图像,其中place = 1和cardinality = 0。 但是我收到一个错误:

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

因此,我的问题是:是否可以在Deliciouspie模型资源中使用来自另一个模型的查询结果? 对不起,我的英语不好,如果出现问题,请纠正我。 谢谢你的时间。 有完整的代码:

MODELS.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']
django api tastypie denormalization
1个回答
1
投票

您得到的错误是由于您访问模型而不是实例image属性而引起的。

dehydrate方法中脱水的对象存储在bundle参数的obj属性中。 另外,您要过滤place_image车型只有那些place=1cardinality=0通过访问image的属性place_image模型类。 由于image不是ModelManager实例,因此此类过滤将不起作用。 您应该改为使用objects属性。 此外, get()方法返回实际的模型实例,因此对get()的后续调用将引发AtributeError因为place_image模型实例没有属性get

因此,总的来说,您的dehydrate应如下所示:

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

请注意,此代码需要 place_image用需要的值存在,否则place_image.DoesNotExist将被抛出。

您的模型中还存在一些冗余:

  • 可以删除idPlaceidImage ,因为默认情况下django创建一个AutoField ,当没有定义其他主键字段时,该AutoField是称为id主键
  • place_image.place字段具有冗余的to_field参数,因为默认情况下ForeignKey指向主键字段
© www.soinside.com 2019 - 2024. All rights reserved.