是否可以将模型的@property装饰器与Model.values()一起使用?

时间:2017-08-24 13:00:47

标签: python django django-models

我有一个包含以下字段和装饰器的模型:

class Item(models.Model):

    title = models.CharField(db_index=True, max_length=100)
    thumb = models.CharField(max_length=1000)
    vendor = models.CharField(max_length=15)
    url = models.CharField(max_length=255, unique=True)
    views = models.CharField(max_length=64)

    @property
    def parsed_thumb()
        return = self.url + "/static/" + self.thumb

我在基于类的视图中查询:

results = Items.objects.filter(title__icontains=query).order_by('-views')[offset:limit].values('id', 'url', 'title', 'vendor', 'thumb')

问题是调用values()返回db字段,据我所知,无法与属于Items模型的@property装饰器进行交互。

我需要parsed_thumb()的返回值。我有什么选择?

2 个答案:

答案 0 :(得分:2)

Querysets可以与数据库进行交互,其中属性只能由模型访问。您可以使用Concat注释属性以使用查询集,但这不会使用该属性

results = Items.objects.filter(title__icontains=query).order_by('-views')
results = results.annotate(parsed_thumb=Concat('url', Value('/static/'), 'thumb'))[offset:limit].values('id', 'url', 'title', 'vendor', 'thumb', 'parsed_thumb')

答案 1 :(得分:1)

如果您使用这种简单的方法,可以尝试使用QuerySet.extra

results = Items.objects.extra(
    select={'parsed_thumb': "url || '/static/' || thumb"}
).filter(title__icontains=query).order_by('-views')[offset:limit].values(
'id', 'url', 'title', 'vendor', 'thumb', 'parsed_thumb')