2017-08-24 77 views
1

我有以下字段和装饰的典范:是否有可能使用Model.values()模型的@property装饰器?

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()返回数据库字段,并为据我所知,无法与属于Items模型的@property装饰器进行交互。

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

+3

您确实需要使用'值()'?为什么不使用常规的查询集并访问该属性? – Alasdair

回答

2

查询集是否有与数据库中,作为属性只能访问模型进行交互。你可以标注使用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') 
+0

我喜欢这个解决方案,它适用于我遇到的问题,所以我会将其标记为正确。不幸的是,我简化了这个问题,所以我可以很容易地解释它。我也有其他领域,需要从二进制转换为十进制,以及其他修改。我很快试图扩展你的答案,为我的其他问题工作如下所示: 'results = results.annotate(dec_num = self.bin_to_dec(bin_field))''但它看起来像我只能使用链接中的Django数据库函数提供。不过,谢谢你为我提出的问题提供了一个很好的答案。 – Sam

+0

@Sam - 您可能会感到困难(请参阅[Django自定义注释函数](https://stackoverflow.com/q/30416270/1324033))。这里的答案建议使用额外的内容,但是在django文档中使用额外的内容会有很大的警告。 – Sayse

+1

是的,我越看这个问题,我越发现它可能会变得混乱。出于显而易见的原因,我真的不想使用'extra()'。 – Sam

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') 
相关问题