首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向django查询添加一个虚拟字段

问向django查询添加一个虚拟字段
EN

Stack Overflow用户
提问于 2019-08-05 09:13:54
回答 2查看 1.5K关注 0票数 2

我想向Django中的查询集添加一个额外的字段。

该字段不存在于模型中,但我希望将其添加到查询集中。

基本上,我想添加一个额外的字段,称为“即将到来”,它应该返回"True“。

我已经尝试将@property方法添加到我的模型类中。这不起作用,因为显然django查询直接访问DB。

models.py

代码语言:javascript
复制
class upcomingActivity(models.Model):
    title      = models.CharField  (max_length=150)
    address    = models.CharField  (max_length=150)

Views.py

代码语言:javascript
复制
def get(self, request):
    query = upcomingActivity.objects.all()
    feature_collection = serialize('geojson', query ,
                                    geometry_field='location',
                                    fields= ( 'upcoming','title','address','pk' ) 
                                    )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-05 09:22:30

这个答案是因为您不想向模型中添加虚拟属性(模型保持原样)。

若要向queryset结果对象添加附加字段,请执行以下操作:

代码语言:javascript
复制
from django.db.models import BooleanField, Value

upcomingActivity.objects.annotate(upcoming=Value(True, output_field=BooleanField())).all()

生成的查询集中的每个对象都将具有带有布尔值True的属性True。(性能应该很好,因为这对于DB来说很容易,Django/Python不需要做太多额外的工作。)

胡安·卡洛斯评论后编辑:

Django序列化程序用于序列化模型对象,因此默认情况下不会序列化任何非模型字段(因为在本例中,序列化程序主要用于加载/转储DB数据)。

请参阅https://docs.djangoproject.com/en/2.2/topics/serialization/

Django的序列化框架提供了一种将Django模型“转换”为其他格式的机制。

另见:Django - How can you include annotated results in a serialized QuerySet?

根据我自己的经验:

在大多数情况下,我们在视图中使用json.dumps进行序列化,这就像一种魅力。您可以非常灵活地准备数据,满足任何需要,无论是通过注释或处理数据(列表理解等)。然后再通过json把它扔掉。

在您的情况下,另一种可能是在从DB获取数据之后自定义序列化程序或序列化程序的输入。

票数 1
EN

Stack Overflow用户

发布于 2019-08-05 09:21:47

可以使用类函数返回upcoming值,如下所示:

代码语言:javascript
复制
def upcoming(self):
    is_upcoming = # some logic query or just basically set it to true. 
    return is_upcoming

然后按照您的方式在序列化程序中正常调用它。

代码语言:javascript
复制
fields= ( 'upcoming','title','address','pk' )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57355467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档