tastypie中的非规范化模型

时间:2013-10-08 15:47:47

标签: django api tastypie denormalization

我要做的是将模型中的查询结果添加到模型资源中,正如您在此代码块中看到的那样:

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

所以,我的问题是:在tastypie模型资源中使用另一个模型的查询结果是不可能的吗?对不起我的英文不好,请纠正我,如果出了什么问题。谢谢你的时间。 有完整的代码:

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']

1 个答案:

答案 0 :(得分:1)

您获得的错误是由于您正在访问模型image属性,而不是实例

dehydrate方法中正在脱水的对象存储在obj参数的bundle属性中。此外,您还尝试通过访问place_image模型类的place=1属性,将cardinality=0模型过滤为只有imageplace_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的主键id
  • place_image.place字段具有冗余to_field参数,默认情况下ForeignKey指向主键字段